3

我通过 LoadLibrary 加载一个模块(exe/dll)并在其中获取一个二进制资源的指针。

微软注意应该使用三个步骤:

  1. 使用 FindResource 返回 HRSRC
  2. 将 LoadResource 与该 HRSRC 一起使用并返回 HGLOBAL
  3. 使用 LockResource 锁定 HGLOBAL 以最终返回您想要的指针。

我不明白为什么MS设计这个过程如此奇怪?

如果要检测 resource 的长度,必须使用 SizeofResource 和第一步返回的指针,但不能输入 step2 和 step3 返回的指针。

如果检查这些步骤输出的指针地址,我得到了结果:

  1. LoadLibrary 加载的模块地址范围内的所有指针地址。
  2. step2 和 step3 的地址是一样的。

谁能解释一下这些函数到底是做什么的?

4

1 回答 1

5

这些功能可以追溯到 Windows 3.x 时代,当时内存稀缺,资源一直保存在磁盘上,直到需要它们。FindResource 在磁盘文件的资源表中找到它们,LoadResource 将它们加载到内存中。内存被分配为“可移动”,这意味着内存管理器可以根据需要移动它以释放空间以形成更大的连续块。因此需要使用 LockResource 锁定内存,然后才能访问它。

由于 Windows 2000/XP 很多这些步骤是多余的,但这些功能仍然是为了向后兼容。

于 2012-09-03T11:41:36.347 回答