首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CMemLoadDll使用的疑惑? GetModuleHandle("USER32.DLL")的时候,返回了NULL,这是为何?该如何处理

2012-06-03 
CMemLoadDll使用的疑惑? GetModuleHandle(USER32.DLL)的时候,返回了NULL,这是为何?GOOGLE了半天, CMemLo

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

热点排行