# C++ 封装资源文件为DLL并调用(Windows环境) ## 1. 创建资源DLL项目 1.1 创建DLL项目 使用Visual Studio创建Win32 DLL项目,选择"导出符号"选项。 1.2 添加资源文件 1. 右键项目 -> 添加 -> 资源 2. 选择资源类型(如BITMAP、CUSTOM等) 3. 导入资源文件 ## 2. 编写资源访问函数 ```cpp // ResourceDLL.h #ifdef RESOURCEDLL_EXPORTS #define RESOURCEDLL_API __declspec(dllexport) #else #define RESOURCEDLL_API __declspec(dllimport) #endif extern "C" { RESOURCEDLL_API HGLOBAL LoadResourceFromDLL(LPCTSTR lpName, LPCTSTR lpType); RESOURCEDLL_API void FreeResourceFromDLL(HGLOBAL hResource); } ``` ```cpp // ResourceDLL.cpp #include "ResourceDLL.h" #include <Windows.h> HINSTANCE hInstance; BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: hInstance = hModule; break; } return TRUE; } RESOURCEDLL_API HGLOBAL LoadResourceFromDLL(LPCTSTR lpName, LPCTSTR lpType) { HRSRC hRes = FindResource(hInstance, lpName, lpType); if (!hRes) return NULL; HGLOBAL hData = LoadResource(hInstance, hRes); if (!hData) return NULL; return hData; } RESOURCEDLL_API void FreeResourceFromDLL(HGLOBAL hResource) { if (hResource) { UnlockResource(hResource); FreeResource(hResource); } } ``` ## 3. 客户端调用示例 ```cpp // Client.cpp #include <Windows.h> #include <iostream> typedef HGLOBAL (*LoadResourceFunc)(LPCTSTR, LPCTSTR); typedef void (*FreeResourceFunc)(HGLOBAL); int main() { HMODULE hDll = LoadLibrary(L"ResourceDLL.dll"); if (!hDll) { std::cerr << "无法加载DLL" << std::endl; return 1; } LoadResourceFunc pLoad = (LoadResourceFunc)GetProcAddress(hDll, "LoadResourceFromDLL"); FreeResourceFunc pFree = (FreeResourceFunc)GetProcAddress(hDll, "FreeResourceFromDLL"); if (!pLoad || !pFree) { FreeLibrary(hDll); std::cerr << "无法获取函数地址" << std::endl; return 1; } // 使用资源ID和类型加载资源 HGLOBAL hData = pLoad(MAKEINTRESOURCE(IDR_MYRESOURCE1), RT_RCDATA); if (hData) { LPVOID pData = LockResource(hData); DWORD dwSize = SizeofResource(NULL, hData); // 使用资源数据... std::cout << "资源加载成功,大小: " << dwSize << "字节" << std::endl; pFree(hData); } FreeLibrary(hDll); return 0; } ``` ## 4. 资源定义文件 在资源脚本(.rc)文件中定义资源: ``` IDR_MYRESOURCE1 RCDATA "myfile.bin" ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 资源ID冲突问题:确保DLL和客户端程序使用相同的资源ID定义,或使用字符串标识符代替数字ID 2. 内存管理:必须成对调用LoadResource/FreeResource,避免内存泄漏 3. 线程安全:多线程环境下访问资源时需要考虑同步问题 [2025-08-08 09:00:22 | AI写代码神器 | 871点数解答]