首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保持地址不变的同时重新映射MapViewOfFile

在保持地址不变的同时重新映射MapViewOfFile
EN

Stack Overflow用户
提问于 2019-09-24 13:10:43
回答 1查看 159关注 0票数 0

我希望解决的基本问题是有两个由物理内存支持的虚拟内存区域(即VirtualAlloc),第三个虚拟内存区域“指向”其他两个虚拟内存区域中的一个。

虽然我相信您可以使用MapViewOfFileEx映射两个备份内存区域中的一个,但我找不到任何方法来确保在将映射从一个区域映射到另一个区域时lpBaseAddress不会被窃取。

我最初的想法是使用MEM_RESERVE进行VirtualAlloc,但是MapViewOfFileEx不能使用保留内存。

我相信我可以用shm_open和系列在posix上完成同样的事情,因为mmap可以覆盖映射的区域。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 15:15:36

如果地址正在使用中,则不能直接覆盖该地址。

要使用相同的地址(mappedAddress),您需要在重新映射之前调用UnmapViewOfFile。如下所示:

代码语言:javascript
运行
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58073427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档