1、静态调用方式(隐式调用):由编译系统完成对 DLL 的加载和应用程序结束时
DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减 1,直
到所有相关程序都结束对该 DLL 的使用时才释放它),简单实用,但不够灵活,只能满足
一般要求。
隐式的调用:需要把产生动态连接库时产生的.LIB 文件加入到应用程序的工程中,想
使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary()和
FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB
导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实
际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件
中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对
应的 DLL 文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。
当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载
DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL
文件都会在应用程序 EXE 文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL
输出函数信息的输入库文件(.LIB 文件)。操作系统在加载使用可执行程序时加载 DLL。可
执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其他的函数是一样的。
2、动态调用方式(显式调用):是由编程者用 API 函数加载和卸载 DLL 来达到调用
DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方
式。
显式的调用:是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式
的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用
GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义
的函数一样来调用此引入函数了。在应用程序退出之前,应该用 FreeLibrary 或 MFC 提
供的 AfxFreeLibrary 释放动态连接库。直接调用 Win32 的 LoadLibary 函数,并指定
DLL 的路径作为参数。LoadLibary 返回 HINSTANCE 参数,应用程序在调用
GetProcAddress 函数时使用这一参数。GetProcAddress 函数将符号名或标识号转换为
DLL 内部的地址。程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加
载哪个 DLL 文件。使用 DLL 的程序在使用之前必须加载(LoadLibrary)加载 DLL 从而
得到一个 DLL 模块的句柄,然后调用 GetProcAddress 函数得到输出函数的指针,在退
出之前必须卸载 DLL(FreeLibrary)。
Windows 将遵循下面的搜索顺序来定位 DLL:
评论0
最新资源