gpt4 book ai didi

c++ - Windows编程中的DLL加载

转载 作者:行者123 更新时间:2023-11-28 00:29:24 25 4
gpt4 key购买 nike

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

enter code here

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

最佳答案

GetModuleHandle() 要求已加载 DLL:

Retrieves a module handle for the specified module. The module must have been loaded by the calling process.

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

使用 LoadLibrary()对于默认情况下未加载的 DLL。但是,使用 LoadLibrary()如果GetModuleHandle()失败是一种危险的策略,因为进程中的其他线程可能会 FreeLibrary()您通过 GetModuleHandle() 获得句柄的 DLL (这意味着您通过该句柄获取的任何函数地址都是无效的,因为 DLL 不再位于内存中)。使用 LoadLibrary() , 随后是 FreeLibrary() ,是一种更安全的方法,因为它确保 DLL 不会被卸载,直到您 FreeLibrary()

关于c++ - Windows编程中的DLL加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com