使用分配的共享内存块CreateFileMapping()
并给出它的句柄。一些数据是使用写入的MapViewOfFile()
——称之为“源”
现在我希望将共享内存分成许多小块并获取它们的句柄。
有没有办法在不CreateFileMapping()
再次调用并从“源”复制的情况下做到这一点?
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.