Un bloc de mémoire partagée est alloué en utilisant CreateFileMapping()
et le handle correspondant est donné. Certaines données ont été écrites en utilisant MapViewOfFile()
- appelez cela 'source'Fractionner la mémoire partagée?
Maintenant, je souhaite diviser la mémoire partagée en plusieurs petits blocs et d'obtenir les poignées pour eux.
Y at-il un moyen de faire cela sans appeler à nouveau CreateFileMapping()
et de copier à partir de «source»?
OpenFileMapping()
et MapViewOfFile()
avec des décalages appropriés fonctionne, mais le problème est, dans ce cas, le processus qui appelle OpenFileMapping()
arriver à avoir accès aux données écrites dans « source » par d'autres processus et ils peuvent être endommagées en utilisant un décalage erroné.
Longue histoire courte, je cherche quelque chose comme OpenFileMapping(String name, UINT **offset**, ...)
La dernière phrase était trompeuse.
Ce que je suis vraiment en train de faire est quelque chose comme ceci:
<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.
... Pourquoi ne pouvez-vous pas simplement passer des pointeurs au milieu de celui-ci? –
C'est un projet multi-processus donc ... –
Comment vous attendez-vous à ce que les autres processus obtiennent le fichier ouvert alors? –