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

VS2022中DLL注入时FindResource返回NULL问题求助

问题解决:DLL注入后FindResource返回NULL的原因及修复
  • 核心问题出在FindResource的第一个参数:当你传NULL时,在EXE程序里它指向的是当前进程的主模块(也就是你的EXE本身),资源本来就在EXE里,所以能找到。但DLL注入到其他进程后,NULL指向的是被注入进程的主EXE模块,而你的资源是编译在DLL里的,自然会提示找不到资源类型。

  • 修复步骤很简单,只要让FindResource指向DLL自身的模块句柄就行:

    1. 最稳妥的方式是在DLL的DllMain里保存模块句柄:
      HINSTANCE g_DllModule = NULL;
      
      BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
      {
          switch (ul_reason_for_call)
          {
          case DLL_PROCESS_ATTACH:
              g_DllModule = hModule; // 把DLL的模块句柄存起来
              break;
          // 其他case保持默认
          case DLL_THREAD_ATTACH:
          case DLL_THREAD_DETACH:
          case DLL_PROCESS_DETACH:
              break;
          }
          return TRUE;
      }
      
      // 加载资源的代码里改成这样
      void LoadResourceFromDll()
      {
          // 用保存的DLL模块句柄代替NULL
          HRSRC myResource = FindResource(g_DllModule, MAKEINTRESOURCE(你的资源ID), RT_RCDATA);
          if (!myResource)
          {
              DWORD errCode = GetLastError();
              // 可以根据errCode进一步排查,比如用FormatMessage输出具体错误信息
          }
      }
      
    2. 如果你不想在DllMain里存句柄,也可以用GetModuleHandle(L"你的DLL文件名.dll")直接获取,但要注意文件名必须完全匹配(包括.dll后缀),如果DLL被重命名就会失效,所以优先推荐第一种方法。
  • 额外检查项:

    • 确认DLL项目里的RC资源确实添加成功,资源ID和代码里的参数完全一致,别写错数字或宏名。
    • 编译完DLL后,可以用Resource Hacker这类工具打开DLL文件,确认里面存在RT_RCDATA类型的资源,避免编译时资源没被嵌入。

内容的提问来源于stack exchange,提问作者coolguy123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:35:22