C++ 分割共享内存?

C++ 分割共享内存?,c++,winapi,C++,Winapi,使用CreateFileMapping()分配共享内存块,并给出其句柄。一些数据是使用MapViewOfFile()编写的——称之为“源” 现在,我希望将共享内存拆分为许多小块,并获取它们的句柄。 在不再次调用CreateFileMapping()并从“源”复制时,有没有办法做到这一点 OpenFileMapping()和MapViewOfFile()使用适当的偏移量可以工作,但问题是,在这种情况下,调用OpenFileMapping()的进程可以访问其他进程在“源”中写入的数据,并且它们可能由

使用
CreateFileMapping()
分配共享内存块,并给出其句柄。一些数据是使用
MapViewOfFile()
编写的——称之为“源”

现在,我希望将共享内存拆分为许多小块,并获取它们的句柄。
在不再次调用
CreateFileMapping()
并从“源”复制时,有没有办法做到这一点

OpenFileMapping()
MapViewOfFile()
使用适当的偏移量可以工作,但问题是,在这种情况下,调用
OpenFileMapping()
的进程可以访问其他进程在“源”中写入的数据,并且它们可能由于使用错误的偏移量而损坏

长话短说,我正在寻找类似于
OpenFileMapping(字符串名,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.

HANDLE hShm=CreateFileMapping(无效的句柄值,,“shm”);
void*pShm=MapViewOfFile(hShm);
UINT numShms=*(UINT*)pShm;//前4个字节存储共享内存块的数量
句柄*hShmSplit=新句柄[numShms];

for(size_t i=0;i共享内存通过将同一物理内存页映射到多个进程的虚拟地址空间来工作。一旦一个进程访问了内存页,它就可以访问整个页面。内存页的长度为4KB(尽管有安腾)

因此,如果你能将一个映射文件分割成多个片段,那么这些片段就必须从页面边界开始,并且大小必须是4KB的精确倍数,所以它就没那么有用了


如果您想与不同的客户端进程安全地共享不同的内存位,则必须为每个进程使用单独的映射。

…为什么不能将指针传递到中间位置?这是一个多进程项目,因此…您希望其他进程如何获得打开的文件?名称:OpenFileMapping(…,LPCTSTR name)那么您需要的是传递有效偏移量的某种方式。