在C ++中使用PE文件中包含的资源(例如二进制资源)时。我们必须 第一次打电话
1)FindResource然后
2)LoadResource
访问资源。
准确了解函数名称“LoadResource”我想知道“Windows Loader”是否在加载其他部分(如代码或数据部分)时加载应用程序的所有资源,或者仅在我们需要时才加载延迟他们?
如果我们使用这些资源以便释放分配的内存,我们是否可以卸载这些资源?
答案 0 :(得分:7)
这些功能很旧,它们可以追溯到尚未支持虚拟内存的Windows版本。回到过去,他们实际上会将资源物理加载到RAM中。
那些日子早已过去,OS加载程序创建一个内存映射文件,将可执行文件映射到内存中。当程序取消引用指针时,文件(代码和资源)中的任何内容都只映射到RAM中。您只需支付使用的费用。
所以LoadResource()做的很少,它只是返回一个指针,伪装成一个HGLOBAL句柄。 LockResource()没有任何意义,它只是将HGLOBAL强制转换为指针。当你真正开始使用它时,你将绊倒页面错误,内核读取文件,将其加载到RAM中。 UnlockResource()和FreeResource()什么都不做。如果操作系统需要另一个进程的RAM,那么它可以取消映射资源的RAM。没有什么需要保留,因为内存由文件支持,页面可以简单地丢弃。如果再次使用该资源,请在必要时重新登录。