windows - 加载 PE 文件的资源时

标签 windows visual-c++ embedded-resource portable-executable

在 C++ 中使用 PE 文件中包含的资源(例如二进制资源)时。我们必须 第一次打电话

1 )FindResource 然后

2 )加载资源
访问资源。

关于函数名称“LoadResource”的准确信息我想知道“Windows Loader”是否在加载其他部分(如代码或数据部分)时将应用程序的所有资源加载到内存中,或者它们仅在我们需要时才延迟加载他们 ?

如果是这样,我们可以在使用这些资源后卸载它们以释放分配的内存吗?

最佳答案

这些函数很旧,它们可以追溯到还不支持虚拟内存的 Windows 版本。在过去,他们实际上会将资源加载到 RAM 中。

那些日子早已一去不复返了,操作系统加载器创建一个内存映射文件来将可执行文件映射到内存中。当程序取消引用指针时,文件中的任何内容(代码和资源)只会映射到 RAM 中。您只需为使用的内容付费。

所以 LoadResource() 做的很少,它只是返回一个指针,伪装成 HGLOBAL 句柄。 LockResource() 没有做任何有趣的事情,它只是将 HGLOBAL 转换回指针。当你真正开始使用它时,你会遇到页面错误,内核读取文件,将其加载到 RAM 中。 UnlockResource() 和 FreeResource() 什么都不做。如果操作系统需要 RAM 用于另一个进程,则它可以取消映射资源的 RAM。由于文件支持内存,因此不需要保留任何内容,可以简单地丢弃该页面。如果您再次使用该资源,则在必要时调回。

关于windows - 加载 PE 文件的资源时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585817/

相关文章:

Java7 WatchService - 尝试删除递归监视的嵌套目录时出现拒绝访问错误(仅限 Windows)

C - 具有命名参数的函数指针类型

c++ - 在 Visual Studio 2013 中找不到 C++ ATL 库(atl.lib 和 atl120.dll)

vb.net - 如何在 Visual Basic 中获取资源文件值?

asp.net - Visual Studio : Should one use a separate Resource-Files-Project for Resource-Files?

visual-studio - Visual Studio 2012 - 如何将多个构建操作分配给 TypeScript 文件

windows - 如何创建删除文件的命令?

windows - windows下ffmpeg libcdio输入设备

c++ - 是否可以在类似 STL 的容器中使用 WinRT 对象?

visual-c++ - Visual C++/CLI (CLR) 空指针