【发布时间】:2014-06-12 08:15:04
【问题描述】:
我正在创建一个带有嵌入式二进制资源的 dll。目前,当我加载这个 DLL 时,它会将内存映射到我的进程地址空间中。问题是嵌入的二进制资源非常庞大,我不想在使用完后保留它。
我尝试查找有关此的文档,显然 PE 文件中的某些部分没有获得内存映射(重定位部分)。此外,我可以创建新部分并将其标记为 IMAGE_SCN_MEM_DISCARDABLE,但此标记在内核模式之外被忽略。
有一个 win API 函数支持为 16 位 Windows 释放资源,但不适用于 32 位以上。 documentation 表示“此功能已过时,仅支持向后兼容 16 位 Windows。对于 32 位 Windows 应用程序,无需释放使用 LoadResource 加载的资源。如果在 32 位或 64 位上使用Windows 系统,此函数将返回 FALSE”。我不知道他们的意思是什么,但似乎他们并不期望资源很大并且可以容纳在地址空间中。
在我使用完加载的资源后,我有什么办法可以继续丢弃它们?
【问题讨论】:
-
可执行文件的 .rsrc 部分已经可以丢弃。除非您出于某种原因需要地址空间,否则帮助没有任何意义。 64 位操作系统本身就是一个迅速消失的问题,正在变得普遍。您可以将资源放在另一个 DLL 中,以便显式卸载它。
标签: c++ windows winapi dll portable-executable