使用它后丢弃DLL的资源

我正在创build一个embedded式二进制资源的DLL。 目前当我加载这个DLL时,它会将内存映射到我的进程地址空间中。 问题是,embedded式二进制资源是巨大的,我不想保留它,一旦我完成使用它。

我试图查找关于这个文件,显然有没有得到内存映射(重定位部分)PE文件中的部分。 此外,我可以创build新的部分并将其标记为IMAGE_SCN_MEM_DISCARDABLE,但在内核模式之外忽略此标志。

有一个赢得API函数,支持释放资源的16位Windows,但不工作32位以上。 文档中提到“此function已过时,仅支持与16位Windows兼容,对于32位Windows应用程序,不需要使用LoadResource释放资源,如果在32或64位Windows系统上使用,这个函数将返回FALSE“。 我不知道他们是什么意思,但他们似乎并不期望资源是巨大的,可以容纳在地址空间。

在我完成使用后,有没有办法让我放弃加载的资源?

如果需要,系统将丢弃它们。 只要你不是指内存,如果系统需要物理内存来做其他事情,它可以被丢弃和分页。 所以,它不会停止正在使用的物理内存。

也就是说,链接的资源并不是很大。 重点是一个模块被映射到一个连续的内存范围。 如果你的模块真的很大,那么可能不可能找到这样一个连续的内存范围。 更重要的是,该模块的地址范围是保留整个生命周期的资源。 这意味着进程中没有其他任何东西可以使用该虚拟内存地址范围。 所以,即使可以找到连续的地址范围,它也是永远为模块保留的,而且这个地址范围不能用于其他任何事情。 这对于32位应用程序来说很容易成为问题。

因此,将巨大的资源放在内存中不会造成物理资源的长期消耗,但是您将对虚拟内存地址空间资源施加不可避免的限制。

得出的结论是,这些巨大的对象应该保存在外部文件中,而不是作为资源链接到模块。 如果您绝对必须在PE模块中使用资源,请将该资源放入单独的DLL中。 使用LoadLibrary加载DLL,使用从LoadLibrary获得的模块句柄提取资源,然后使用FreeLibrary卸载DLL。