공유 메모리 블록은 CreateFileMapping()
을 사용하여 할당되며 그에 대한 핸들이 제공됩니다. 일부 데이터는 MapViewOfFile()
을 사용하여 작성되었습니다. '소스'라고합니다.공유 메모리 분할 중입니까?
이제 공유 메모리를 많은 작은 블록으로 분할하고 핸들을 가져 오려합니다.
CreateFileMapping()
을 다시 호출하지 않고 '원본'에서 복사하는 중에 수행 할 수있는 방법이 있습니까? 적절한 오프셋 (offset)를
OpenFileMapping()
및 MapViewOfFile()
는 작동하지만 문제는이 경우에, OpenFileMapping()
가 다른 프로세스에 의해 '소스'에 기록 된 데이터에 액세스 할 수 그들이 잘못된 오프셋을 사용하여 손상 될 수 있습니다 호출하는 과정이다.
길고도 짧은 이야기, 내가 OpenFileMapping(String name, UINT **offset**, ...)
처럼 뭔가를 찾고 있어요 마지막 문장은 오해의 소지가 있었다.
<Host process>
HANDLE hShm = CreateFileMapping(INVALID_HANDLE_VALUE, ..., "shm");
void* pShm = MapViewOfFile(hShm);
UINT numShms = *(UINT*)pShm; // first 4 bytes stores number of shared memory blocks
HANDLE *hShmSplit = new HANDLE[numShms];
for(size_t i=0; i<numShms; i++) {
TCHAR shmName[32];
wsprintf(shmName, "shm%d", i);
// suppose offset is set
pShm+=offset;
hShmSplit[i] = *CreateFileMappingFromExistingMapping*(pShm, shmName);
}
CloseHandle(hShm); // no longer used
<Client process>
TCHAR* shmName="shm1";
HANDLE hShm = OpenFileMapping(shmName);
LPVOID p = MapViewOfFile(hShm);
// use shared memory
// Now the client process has access to shm1 but not to shm2, shm3, or other shm_x's.
... 왜 그 중간에 포인터를 전달할 수 없습니까? –
그것은 다중 프로세스 프로젝트이므로 ... –
열려있는 파일에 다른 프로세스가 어떻게 도달 할 것으로 예상합니까? –