关于动态链接库

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

动态链接允许模块仅包含系统在加载时或运行时需要的信息,以找到导出的DLL函数的代码。动态链接与更熟悉的静态链接不同,链接器将库函数的代码复制到调用它的每个模块中。

动态链接的类型

在DLL中调用函数有两种方法:

*在【加载时动态链接】中,一个模块对导出的DLL函数进行了显式调用。这需要您将模块与DLL的导入库相链接。导入库为操作系统提供加载DLL所需的信息,并在应用程序加载时定位导出的DLL函数。有关详细信息,请参阅加载时动态链接.

*在【运行时动态链接】中,模块使用LoadLibraryLoadLibraryEx函数在运行时加载DLL。加载DLL后,模块调用GetProcAddress函数获取导出的DLL函数的地址。该模块使用GetProcAddress返回的函数指针调用导出的DLL函数。这样就省去了一个导入库。有关详细信息,请参阅使用运行时动态链接.

DLL和内存管理

加载DLL的每个进程将其映射到其虚拟地址空间。在将进程加载到其虚拟地址之后,它可以调用导出的DLL函数。

系统维护每个DLL的引用计数。线程加载DLL时,其引用计数将增加1。当进程终止时,或当引用计数变为0(仅运行时动态链接)时,DLL将从虚拟地址空间卸载。

像任何其他功能一样,导出的DLL函数在调用它的线程的上下文中运行。因此,适用以下条件:

*调用DLL的进程的线程可以使用由DLL函数打开的句柄。类似地,可以在DLL函数中使用由调用进程的任何线程打开的句柄。

* DLL使用调用线程的堆栈和调用进程的虚拟地址空间。

* DLL从调用进程的虚拟地址空间分配内存。