在回答有关将不连续的文件块映射到连续内存的问题时,一位受访者建议我应该使用VirtualAllocEx () 和 MEM_RESERVE,以便为最终 (lpBaseAddress) 参数建立一个“安全”值对于MapViewOfFileEx ()。
进一步调查显示,这种方法会导致 MapViewofFileEx() 失败并出现错误 487:“尝试访问无效地址”。 MSDN 页面说:
“在用于映射的区域中不能进行其他内存分配,包括使用 VirtualAlloc 或 VirtualAllocEx 函数来保留内存。”
虽然关于有效调用序列的文档可能被认为是模棱两可的,但实验表明使用 VirtualAllocEx() 为 MapViewOfFileEx() 保留内存是无效的。
在网上,我找到了带有硬编码值的示例 -示例:
#define BASE_MEM (VOID*)0x01000000
...
hMap = MapViewOfFileEx( hFile, FILE_MAP_WRITE, 0, 0, 0, BASE_MEM );
对我来说,这似乎是不够的和不可靠的......我还不清楚为什么这个地址是安全的,或者有多少块可以安全地映射到那里。考虑到我需要我的解决方案在其他分配的上下文中工作……而且我需要我的源代码在 32 位和 64 位上下文中编译和工作,这似乎更加不稳定。
我想知道的是,是否有任何方法可以可靠地保留地址空间池,以便 - 随后 - MapViewOfFileEx 可以可靠地使用它来将块映射到显式内存地址。