导入和导出
可以使用两种方法将公共符号导入应用程序或从 DLL 导出函数:
生成 DLL 时使用模块定义 (.def) 文件
在主应用程序的函数定义中使用关键字
__declspec(dllimport)
或__declspec(dllexport)
使用 .def 文件
模块定义 (.def) 文件是文本文件,其中包含一个或多个描述 DLL 的各种特性的模块语句。 如果没有使用 __declspec(dllimport)
或 __declspec(dllexport)
来导出 DLL 的函数,则 DLL 需要 .def 文件。
可以使用 .def 文件导入到应用程序中或从 DLL 导出。
使用 __declspec
正确编译代码不需要使用 __declspec(dllimport)
,但是这样做可以让编译器生成更优质的代码。 编译器能够生成更好的代码,因为它可以确定某个函数是否存在于 DLL 中,这使编译器生成的代码可以跳过在跨越 DLL 边界的函数调用中通常存在的间接级别。 不过,必须使用 __declspec(dllimport)
来导入 DLL 中使用的变量。
对于正确的 .def 文件 EXPORTS 部分,__declspec(dllexport)
是不需要的。 添加 __declspec(dllexport)
是为了提供一种简单的方法,可以在不使用 .def 文件的情况下从 .exe 或 .dll 文件导出函数。
Win32 可移植可执行文件格式旨在最大程度减少修复导入所必须涉及的页数。 为此,它将任何程序的所有导入地址都放置在一个名为导入地址表的位置。 这使加载程序可以在访问这些导入时仅修改一页或两页。