创建动态链接库

要创建动态链接库 (DLL),必须创建一个或多个源代码文件,可能还需要创建一个用于导出函数的链接器文件。 如果计划允许使用 DLL 的应用程序使用加载时动态链接,则还必须创建导入库。

创建源文件

DLL 的源文件包含导出的函数和数据、内部函数和数据,以及 DLL 的可选入口点函数。 可以使用支持创建基于 Windows 的 DLL 的任何开发工具。

如果 DLL 可由多线程应用程序使用,则应使 DLL“线程安全”。 若要避免数据损坏,必须同步对 DLL 的所有全局数据的访问。 还必须确保仅链接到线程也安全的库。 例如,Microsoft Visual C++ 包含多个版本的 C 运行时库,其中一个版本不是线程安全的,另外两个版本是线程安全的。

导出函数

如何指定应导出 DLL 中的哪些函数取决于用于开发的工具。 某些编译器使你可使用函数声明中的修饰符直接在源代码中导出函数。 其他情况下,必须在传递给链接器的文件中指定导出。

例如,使用 Visual C++ 时,可通过两种方法导出 DLL 函数:使用 __declspec(dllexport) 修饰符或使用模块定义 (.def) 文件。 如果使用 __declspec(dllexport) 修饰符,则无需使用 .def 文件。 有关详细信息,请参阅从 DLL 导出

创建导入库

导入库 (.lib) 文件包含链接器解析对导出 DLL 函数的外部引用所需的信息,以便系统可以在运行时找到指定的 DLL 和导出的 DLL 函数。 生成 DLL 时,可以为 DLL 创建导入库。

有关详细信息,请参阅生成导入库和导出文件

使用导入库

例如,要调用 CreateWindow 函数,必须将代码链接到导入库 User32.lib。 这是因为 CreateWindow 驻留在名为 User32.dll的系统 DLL 中,并且 User32.lib 是导入库,用于将代码中的调用解析为 User32.dll 中的导出函数。 链接器将创建一个表,其中包含每个函数调用的地址。 加载 DLL 时,将修复对 DLL 中的函数的调用。 当系统正在初始化进程时,由于该进程依赖于该 DLL 中的导出函数,因此它会加载 User32.dll,并会更新函数地址表中的条目。 对 CreateWindow 的所有调用都会调用从 User32.dll 中导出的函数

有关详细信息,请参阅将可执行文件链接到 DLL