LoadLibraryA与GetProcAddress介绍
0x00 函数原型
0x01 作用
进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。 如果函数执行成功,它会将指定的 DLL 映射到调用进程的地址空间中并返回该 DLL 的句柄。此句柄可以与其他函数(如 GetProcAddress
和 FreeLibrary
)一起在显式链接中使用。
LoadLibrary
将尝试使用用于隐式链接的相同搜索序列来查找 DLL。 如果系统无法找到所需的 DLL 或者入口点函数返回 FALSE,则 LoadLibrary
将返回 NULL。 如果对 LoadLibrary
的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则该函数将返回该 DLL 的句柄并递增模块的引用数。
如果 DLL 具有入口点函数,则操作系统将在调用 LoadLibrary
的线程的上下文中调用此函数。 如果由于以前调用了 LoadLibrary
,但没有相应地调用 FreeLibrary
函数,从而导致已经将 DLL 附加到进程,则不会调用此入口点函数。
对于加载扩展 DLL 的 MFC 应用程序,建议使用 AfxLoadLibrary
,而不使用 LoadLibrary
。 在调用 LoadLibrary
之前,AfxLoadLibrary
处理线程同步。 AfxLoadLibrary
的接口(函数原型)与 LoadLibrary
相同。
显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。 使用返回的函数指针调用 DLL 函数。 GetProcAddress 将(由 LoadLibrary、AfxLoadLibrary
或 GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。
由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。 帮助提供类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。