如何处理win32可执行资源?

时间:2013-12-19 23:49:12

标签: c winapi

我不知道为什么在Google上找到这个问题的答案是如此困难,但我想直截了当。

是否以相同的方式处理win32资源静态数据是将数据保存在RAM中以用于整个进程运行时的位置,还是将它们保存在磁盘上,就像常规文件一样,直到加载到内存中?像LoadResource / LoadString这样的函数意味着后者,但我想绝对确定我不会被抽象所欺骗。

2 个答案:

答案 0 :(得分:6)

在过去的日子里(如Windows 3.1及更早版本),资源在加载过程中被复制到内存中,你只需要处理它们。内存管理器可以执行诸如在内存中移动副本以对空间进行碎片整理,甚至秘密卸载资源,直到您再次需要它为止。当您需要资源时,还有第二步将其“锁定”到内存中。这为您提供了指向副本的指针,并确保资源管理器在您再次解锁之前不会移动它。

在32位版本的Windows中,不会复制资源。可执行文件(或DLL)映射到内存中,如果您触摸资源,虚拟内存管理器将确保它在那里。

API(FindResource,LoadResource,LockResource)反映了旧时代,资源句柄和句柄锁定等。但是现在实现起来要简单得多,因为句柄只是指向资源开头的指针,锁定实际上是一个无操作,将句柄转换为指针类型并返回它。

答案 1 :(得分:3)

您可能会注意到所有资源API都接受hModule参数 - 这实际上是指向内存中模块的PE头的指针,而不是磁盘上文件的句柄。因此,PE文件的资源部分(.rsrc)必须存在于程序的内存空间中,才能使这些API工作。当然,与所有内存映射文件一样,在需要之前,数据可能实际上并未被分页到物理RAM中。