确定要使用的导出方法

若要确定用于导出函数的方法(.def 文件或 __declspec(dllexport) 关键字),请回答下列问题:

  • 是否持续添加附加的导出函数?

  • 谁要使用 DLL? 例如,是由许多无法重新生成的可执行文件使用的第三方 DLL 还是仅由可以轻松重新生成的应用程序使用的 DLL?

使用 .DEF 文件的优缺点

在 .def 文件中导出函数使您得以控制导出序号。 当将附加的导出函数添加到 DLL 时,可以给它们分配更高的序号值(高于任何其他导出函数)。 当您进行此操作时,使用隐式链接的应用程序不必与包含新函数的新导入库重新链接。 这非常重要,例如,在设计将由许多应用程序使用的第三方 DLL 时。 可以通过添加附加功能不断地增强 DLL,同时确保现有应用程序继续正常使用新的 DLL。 MFC DLL 是使用 .def 文件生成的。

使用 .def 文件的另一个优点是:可以使用 NONAME 特性导出函数,该特性仅将序号放到 DLL 的导出表中。 对具有大量导出函数的 DLL,使用 NONAME 特性可以减小 DLL 文件的大小。 有关编写模块定义语句的信息,请参见模块定义语句的规则。 有关序号导出的更多信息,请参见按序号而不是按名称从 DLL 导出函数

使用 .def 文件的主要缺点是:在 C++ 文件中导出函数时,必须将修饰名放到 .def 文件中,或者通过使用外部“C”用标准 C 链接定义导出函数,以避免编译器进行名称修饰。

如果需要将修饰名放到 .def 文件中,则可以通过使用 DUMPBIN 工具或 /MAP 链接器选项来获取修饰名。 请注意,编译器产生的修饰名是编译器特定的。 如果将 Visual C++ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C++ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。

使用 __declspec(dllexport) 的优缺点

使用 __declspec(dllexport) 非常方便,因为不必考虑维护 .def 文件和获取导出函数的修饰名。 例如,如果您设计的 DLL 供自己控制的应用程序使用,则此方法很适用。 如果通过新的导出函数重新生成 DLL,还必须重新生成应用程序,因为如果使用不同版本的编译器进行重新编译,则导出的 C++ 函数的修饰名可能会发生变化。

您希望做什么?

您想进一步了解什么?

请参见

概念

从 DLL 导出