查找和加载资源

在使用资源之前,应用程序必须将其加载到内存中。 FindResource 和 FindResourceEx 函数在模块中查找资源,并返回二进制资源数据的句柄。 FindResource 按类型和名称查找资源。 FindResourceEx 按类型、名称和语言查找资源。 本主题中 有关 FindResource 的信息也适用于 FindResourceEx

LoadResource 函数使用 FindResource 返回的资源句柄将资源加载到内存中。 应用程序使用 LoadResource 加载资源后,仅当通过 FreeLibrary 释放对其模块的所有引用时,系统才会卸载关联的内存。 由于重复 的 LoadLibraryFreeLibrary 调用中发生内存映射,需要重复访问特定模块中的相同或多个资源的应用程序可能会产生性能损失。 应用程序应存储单个模块句柄,直到不再需要资源,然后调用 FreeLibrary。 从内存中卸载模块后,资源句柄将变为无效。

应用程序可以使用 FindResourceLoadResource 查找和加载任何类型的资源,但这些函数应仅在以下情况之一中使用:

  • 当应用程序无法使用现有的特定于资源的函数访问资源时。
  • 当应用程序必须以二进制数据的形式访问资源时,才能进行后续函数调用。

只要可能,应用程序应改用以下特定于资源的函数之一在一次调用中查找和加载资源:

函数 操作 删除资源
FormatMessage 加载并设置消息表条目的格式。 无需执行任何操作。
LoadAccelerators 加载加速器表。 DestroyAcceleratorTable
LoadBitmap 加载位图资源。 DeleteObject
LoadCursor 加载游标资源。 DestroyCursor
LoadIcon 加载图标资源。 DestroyIcon
LoadImage 加载图标、光标或位图。 DestroyIconDestroyCursorDeleteObject
LoadMenu 加载菜单资源。 DestroyMenu
LoadString 加载字符串表条目。 无需执行任何操作。

 

请注意上表中的发布函数。 在终止之前,应用程序应使用相应的函数释放加速器表、位图、光标、图标和菜单占用的内存。

通过 FindResourceLoadResource 加载的资源关联的内存将在模块被调用 FreeLibrary 卸载后释放。 系统会自动释放在应用程序终止时卸载的任何资源。