【问题标题】:When Resources of a PE file are loaded当 PE 文件的资源被加载时
【发布时间】:2014-07-05 11:14:59
【问题描述】:

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

1 )FindResource 然后

2 )加载资源
访问资源。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2020-03-15
      相关资源
      最近更新 更多