运行时动态链接

【勇芳软件工作室】汉化HomePreviousNext

当应用程序调用{??989796010}或LoadLibraryEx函数时,系统将尝试使用与加载时动态链接中相同的搜索顺序来定位DLL(请参阅加载时间动态链接)。如果搜索成功,系统将DLL模块映射到进程的虚拟地址空间,并增加引用计数。如果调用LoadLibraryLoadLibraryEx指定了一个DLL,该DLL的代码已经映射到调用进程的虚拟地址空间中,该函数只需向DLL中返回一个句柄,并增加DLL引用计数。请注意,具有相同基本文件名和扩展名但在不同目录中找到的两个DLL不被认为是相同的DLL。

操作系统在调用LoadLibraryLoadLibraryEx的线程的上下文中调用入口点函数。如果DLL已经通过调用LoadLibraryLoadLibraryEx的进程加载,而没有相应调用FreeLibrary函数,则不会调用入口点函数。

如果系统找不到DLL或入口点函数返回FALSE,LoadLibraryLoadLibraryEx返回NULL。如果LoadLibraryLoadLibraryEx成功,则返回DLL模块的句柄。该过程可以使用该句柄来标识对GetProcAddressFreeLibraryFreeLibraryAndExitThread功能的调用中的DLL。

GetModuleHandle函数返回GetProcAddress FreeLibraryFreeLibraryAndExitThread中使用的句柄。只有当DLL模块已经通过加载时链接或先前调用LoadLibraryLoadLibraryEx映射到进程的地址空间中时,GetModuleHandle函数才会成功。与LoadLibraryLoadLibraryEx不同,GetModuleHandle不会增加模块引用计数。GetModuleFileName函数检索与GetModuleHandle LoadLibraryLoadLibraryEx返回的句柄相关联的模块的完整路径。

该过程可以使用LoadLibrary,LoadLibraryEx,GetModuleHandle返回的DLL模块句柄来使用GetProcAddress获取DLL中的导出函数的地址。

当DLL模块不再需要时,该进程可以调用FreeLibraryFreeLibraryAndExitThread.如果引用计数为零,这些函数将减少模块引用计数并从进程的虚拟地址空间中取消映射DLL代码。

运行时动态链接可以使进程继续运行,即使DLL不可用。然后,该过程可以使用替代方法来完成其目标。例如,如果进程无法找到一个DLL,则可以尝试使用另一个DLL,或者可以通知用户错误。如果用户可以提供缺少的DLL的完整路径,该进程可以使用该信息加载DLL,即使它不在正常的搜索路径。这种情况与加载时间链接形成对比,其中如果操作系统找不到DLL,操作系统就会终止进程。

如果DLL使用DllEntryPoint函数为进程的每个线程执行初始化,则运行时动态链接可能会导致问题,因为未调用LoadLibraryLoadLibraryEx之前存在的线程的入口点。有关如何处理此问题的示例,请参阅在动态链接库中使用线程本地存储.