VS2022中DLL注入时FindResource返回NULL问题求助
问题解决:DLL注入后FindResource返回NULL的原因及修复
核心问题出在
FindResource的第一个参数:当你传NULL时,在EXE程序里它指向的是当前进程的主模块(也就是你的EXE本身),资源本来就在EXE里,所以能找到。但DLL注入到其他进程后,NULL指向的是被注入进程的主EXE模块,而你的资源是编译在DLL里的,自然会提示找不到资源类型。修复步骤很简单,只要让
FindResource指向DLL自身的模块句柄就行:- 最稳妥的方式是在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输出具体错误信息 } } - 如果你不想在DllMain里存句柄,也可以用
GetModuleHandle(L"你的DLL文件名.dll")直接获取,但要注意文件名必须完全匹配(包括.dll后缀),如果DLL被重命名就会失效,所以优先推荐第一种方法。
- 最稳妥的方式是在DLL的
额外检查项:
- 确认DLL项目里的RC资源确实添加成功,资源ID和代码里的参数完全一致,别写错数字或宏名。
- 编译完DLL后,可以用Resource Hacker这类工具打开DLL文件,确认里面存在RT_RCDATA类型的资源,避免编译时资源没被嵌入。
内容的提问来源于stack exchange,提问作者coolguy123
相关产品推荐
相关产品推荐

