gpt4 book ai didi

winapi - MapViewOfFileEx - 有效的 lpBaseAddress

转载 作者:行者123 更新时间:2023-12-04 21:20:50 24 4
gpt4 key购买 nike

在回答关于将非连续文件块映射到连续内存的问题时,here , 一位受访者建议我应该使用 VirtualAllocEx () 与 MEM_RESERVE 为 MapViewOfFileEx 的最终 (lpBaseAddress) 参数建立“安全”值()。

进一步调查显示,这种方法会导致 MapViewofFileEx() 失败,并显示错误 487:“尝试访问无效地址”。 The MSDN page says :

"No other memory allocation can take place in the region that is used for mapping, including the use of the VirtualAlloc or VirtualAllocEx function to reserve memory."



虽然文档在有效调用序列方面可能被认为是模棱两可的,但实验表明使用 VirtualAllocEx() 为 MapViewOfFileEx() 保留内存是无效的。

在网上,我找到了带有硬编码值的示例 - example :
#define BASE_MEM     (VOID*)0x01000000

...
hMap = MapViewOfFileEx( hFile, FILE_MAP_WRITE, 0, 0, 0, BASE_MEM );

对我来说,这似乎不够充分且不可靠……我不清楚为什么这个地址是安全的,或者有多少块可以安全地映射到那里。鉴于我需要我的解决方案在其他分配的上下文中工作,而且我需要我的源代码在 32 位和 64 位上下文中编译和工作,这似乎更加不稳定。

我想知道是否有 任何 一种可靠地保留地址空间池的方法,以便 - 随后 - MapViewOfFileEx 可以可靠地使用它来将块映射到显式内存地址。

最佳答案

您几乎自己找到了解决方案,但没有完成最后一小步。
如您所想,使用 VirtualAlloc (使用 MEM_RESERVE )在您的地址空间中找到空间,但在那之后(和之前 MapViewOfFileEx )使用 VirtualFree (与 MEM_RELEASE )。现在地址范围将再次空闲。然后使用与 VirtualAlloc 相同的内存地址(由 MapViewOfFileEx 返回) .

关于winapi - MapViewOfFileEx - 有效的 lpBaseAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12121843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com