を使用して共有メモリのブロックが割り当てられ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.