我希望解决的基本问题是有两个由物理内存支持的虚拟内存区域(即VirtualAlloc),第三个虚拟内存区域“指向”其他两个虚拟内存区域中的一个。
虽然我相信您可以使用MapViewOfFileEx映射两个备份内存区域中的一个,但我找不到任何方法来确保在将映射从一个区域映射到另一个区域时lpBaseAddress不会被窃取。
我最初的想法是使用MEM_RESERVE进行VirtualAlloc,但是MapViewOfFileEx不能使用保留内存。
我相信我可以用shm_open和系列在posix上完成同样的事情,因为mmap可以覆盖映射的区域。
发布于 2019-09-25 15:15:36
如果地址正在使用中,则不能直接覆盖该地址。
要使用相同的地址(mappedAddress),您需要在重新映射之前调用UnmapViewOfFile。如下所示:
HANDLE targetFile = CreateFile(L"target.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
HANDLE fileMap = CreateFileMapping(targetFile, 0, PAGE_READWRITE, 0, 10, L"myTestMap");
LPVOID mappedAddress = MapViewOfFileEx(fileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0, 0);
BOOL result = UnmapViewOfFile(mappedAddress); // Get the address.
HANDLE targetFile2 = CreateFile(L"target2.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
HANDLE fileMap2 = CreateFileMapping(targetFile2, 0, PAGE_READWRITE, 0, 10, L"myTestMap2");
LPVOID mappedAddress2 = MapViewOfFileEx(fileMap2, FILE_MAP_ALL_ACCESS, 0, 0, 0, mappedAddress); // Use the same address.https://stackoverflow.com/questions/58073427
复制相似问题