在Windows编程中加载DLL

时间:2014-05-06 09:15:08

标签: c++ winapi visual-c++ native-code

我想使用GetProcAddressto获得一组API Native'm。在GetModuleHandle首先使用的方法得到了考虑的DLLHandle然后是我想要的API地址,由GetProcAddress采用。它适用于ntdll中的函数,但对于user32和advapi32,GetModuleHandle函数返回null值。为了解决这个问题,你的建议是什么?

enter code here

HANDLE Proc = GetCurrentProcess();
HMODULE hNtdll = GetModuleHandle(TEXT("ntdll.dll"));
FARPROC function_address = GetProcAddress(hNtdll, function_name);

1 个答案:

答案 0 :(得分:3)

GetModuleHandle()要求已加载DLL:

  

检索指定模块的模块句柄。 调用过程必须已加载模块。

ntdll.dll 将始终加载,但默认情况下不一定会加载 user32.dll advapi32.dll 。根据您的描述,听起来好像代码首先调用GetModuleHandle(),如果DLL尚未加载则会失败(如果失败则检查GetLastError()的值)。

对默认情况下未加载的DLL使用LoadLibrary()。但是,在LoadLibrary()失败的情况下使用GetModuleHandle()是一种危险的策略,因为进程中的其他某个线程可能FreeLibrary()已通过GetModuleHandle()获取句柄的DLL (意味着您通过该句柄获取的任何函数地址都是无效的,因为DLL不再在内存中)。将LoadLibrary()与后续FreeLibrary()一起使用是一种更安全的方法,因为它可以确保在您FreeLibrary()之前不会卸载DLL。