查找和加载资源
在使用资源之前,应用程序必须将其加载到内存中。 FindResource 和 FindResourceEx 函数在模块中查找资源,并返回二进制资源数据的句柄。 FindResource 按类型和名称查找资源。 FindResourceEx 按类型、名称和语言查找资源。 本主题中有关 FindResource 的信息也适用于 FindResourceEx。
LoadResource 函数使用 FindResource 返回的资源句柄将资源加载到内存中。 应用程序使用 LoadResource 加载资源后,仅当通过 FreeLibrary 释放对其模块的所有引用时,系统才会卸载关联的内存。 由于 重复的 LoadLibrary 和 FreeLibrary 调用中发生内存映射,需要重复访问特定模块中的相同或多个资源的应用程序可能会产生性能损失。 应用程序应存储单个模块句柄,直到不再需要资源,然后调用 FreeLibrary。 从内存中卸载模块后,资源句柄将变为无效。
应用程序可以使用 FindResource 和 LoadResource 来查找和加载任何类型的资源,但这些函数只应在以下情况之一中使用:
- 当应用程序无法使用现有的特定于资源的函数访问资源时。
- 应用程序必须以二进制数据的形式访问资源以用于后续函数调用时。
如果可能,应用程序应改用以下特定于资源的函数之一在一次调用中查找和加载资源:
函数 | 操作 | 删除资源 |
---|---|---|
FormatMessage | 加载消息表条目并设置其格式。 | 无需执行任何操作。 |
LoadAccelerators | 加载加速键表。 | DestroyAcceleratorTable |
LoadBitmap | 加载位图资源。 | DeleteObject |
LoadCursor | 加载光标资源。 | DestroyCursor |
LoadIcon | 加载图标资源。 | DestroyIcon |
LoadImage | 加载图标、光标或位图。 | DestroyIcon、 DestroyCursor、 DeleteObject |
LoadMenu | 加载菜单资源。 | DestroyMenu |
LoadString | 加载字符串表条目。 | 无需执行任何操作。 |
请注意上表中的发布函数。 在终止之前,应用程序应使用适当的函数释放加速器表、位图、光标、图标和菜单占用的内存。
调用 FreeLibrary 卸载模块后,将释放与通过 FindResource 和 LoadResource 加载的资源关联的内存。 系统将自动释放在应用程序终止时保持卸载状态的任何资源。