CMemLoadDll使用的疑惑? GetModuleHandle("USER32.DLL")的时候,返回了NULL,这是为何?
GOOGLE了半天, CMemLoadDll类应该是VCKBASE的某位大虾的作品.
正好我的项目要用到这个功能,但是发现一个很奇怪的原因,
导致我自己的DLL加载都是失败,特来请教.
而CSDN下载资源里的http://download.csdn.net/source/2821967
Demo带的那个测试DLL,却是可以加载成功的.我用Depends看了下,
这个CalcModule32.DLL只需要导入一个KERNEL32.DLL.
CMemLoadDll具体代码参考:
http://blog.csdn.net/sqcfj/archive/2010/11/09/5997591.aspx
于是我用VC6写了一个最简单的带导出函数的test.dll:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This is an example of an exported function.
extern "C" __declspec (dllexport) void MyMessageBox(char *message)
{
printf("\r\n*******************%s*******************\r\n",message);
}
用Depends看了下,导入了两个DLL,USER32.DLL和KERNEL32.DLL,同样的,
CMemLoadDll还是加载失败了,调试了下,发现出错的地方在于函数
BOOL CMemLoadDll::FillRavAddress(void *pImageBase)
具体代码位置在:
HMODULE hDll = GetModuleHandle(szBuf);
if (hDll == NULL)
{
return FALSE; //NOT FOUND DLL
}
具体点也就是GetModuleHandle("USER32.DLL")的时候,返回了NULL,这是为何?
对PE结构了解不够多和深, 请教各位大虾了.
[解决办法]
用LoadLibrary试试