调用LoadImage后出现Win API错误1813的修复方案咨询
修复LoadImage错误1813(资源未找到)的解决方案
错误1813对应Windows API的ERROR_RESOURCE_TYPE_NOT_FOUND,核心原因是你当前使用的hInstance指向主程序(EXE)的实例句柄,但目标位图资源实际编译在动态库(DLL)中,导致LoadImage无法在EXE的资源表里找到对应资源。
以下是两种可靠的修复方案:
方案一:保存DLL自身的实例句柄(推荐)
DLL加载时,系统会调用DllMain并传入DLL的模块句柄(即DLL的HINSTANCE),只需将这个句柄全局保存,后续加载资源时直接使用即可:
// 全局变量存储DLL实例句柄 HINSTANCE g_hDllModule = nullptr; BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hDllModule = hModule; // 保存DLL的实例句柄 DisableThreadLibraryCalls(hModule); // 可选:优化线程附加/分离逻辑 break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // 你的资源加载函数 HBITMAP LoadDllBitmap(UINT resId) { // 使用DLL自身的实例句柄加载资源 return (HBITMAP)LoadImage(g_hDllModule, MAKEINTRESOURCE(resId), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); }
方案二:通过GetModuleHandle获取DLL句柄
如果无法修改DllMain,可以直接调用GetModuleHandle传入DLL的文件名(不含路径)来获取其实例句柄:
HBITMAP LoadDllBitmap(UINT resId) { // 传入你的DLL文件名,比如"MyResourceDll.dll" HINSTANCE hDllModule = GetModuleHandle(L"MyResourceDll.dll"); if (!hDllModule) { // 处理句柄获取失败的情况,比如输出GetLastError()排查 return nullptr; } return (HBITMAP)LoadImage(hDllModule, MAKEINTRESOURCE(resId), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); }
额外验证要点
- 确认位图资源已正确编译到DLL中:检查DLL的资源脚本(.rc)是否包含该位图,且资源ID与
resId完全匹配。 - 若资源使用字符串名称而非数字ID,直接传入字符串即可,无需使用
MAKEINTRESOURCE。
内容的提问来源于stack exchange,提问作者Irbis
相关产品推荐
相关产品推荐

