谁能解释一下 FindResource/LoadResource/LockResource?

wen*_*ibo 2 windows nested-resources

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

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

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

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

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

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

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

谁能解释一下这些函数究竟做了什么?

Jon*_*ter 5

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

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