读书人

CMemLoadDll使用的疑惑? GetModuleHan

发布时间: 2012-06-03 16:59:40 作者: rapoo

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试试

读书人网 >VC/MFC

热点推荐