谁可以解释FindResource / LoadResource / LockResource?

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

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

  1. 使用FindResource返回HRSRC
  2. 使用LoadResource与该HRSRC并返回HGLOBAL
  3. 使用LockResourcelockingHGLOBAL来返回你最终想要的指针。

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

如果要检测资源的长度,则必须将SizeofResource与从第一步返回的指针一起使用,但不能input从步骤2和步骤3返回的指针。

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

  1. 所有在LoadLibrary加载的模块的地址范围内的指针地址。
  2. 步骤2和步骤3的地址相同。

谁能解释这些function究竟做了什么?

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

从Windows 2000 / XP开始,许多这些步骤都是冗余的,但功能仍然是为了向后兼容。