c-如何处理win32可执行资源



我不知道为什么在谷歌上很难找到这个问题的答案,但我想澄清一下。

win32资源的处理方式与静态数据相同吗?静态数据是在进程的整个运行时间内保存在RAM中的数据,还是像常规文件一样保存在磁盘上,直到加载到内存中?像LoadResource/LoadString这样的函数暗示了后者,但我想绝对确保我没有被抽象所欺骗。

在过去(如Windows 3.1和更早版本),资源在加载过程中被复制到内存中,您只需要获得它们的句柄。内存管理器可以做一些事情,比如在内存中移动副本以整理空间碎片,甚至秘密卸载资源,直到您再次需要它。当您需要资源时,还有第二步将其"锁定"到内存中。这为您提供了一个指向副本的指针,并确保资源管理器在您再次解锁之前不会移动它。

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

API(FindResource、LoadResource、LockResource)反映了过去的情况,包括资源的句柄和句柄的锁定等。但现在的实现要简单得多,因为句柄只是指向资源开头的指针,而锁定实际上是一种非操作,将句柄强制转换为指针类型并返回它。

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

最新更新