You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:25:56