导入dll函数的正确方法是什么?

时间:2016-01-29 17:05:10

标签: c++ dll

假设我的dll包含以下内容:

mydll.h

extern "C" void __declspec(dllexport) __stdcall f();

通常在我的应用程序执行静态dll链接时,我只是包含标题,但是阅读有关dllexport vs dllimport规范的内容我想知道我的应用程序是否应该使用以下原型:

extern "C" void __declspec(dllimport) __stdcall f();

我正在为dll和app使用C ++ Builder XE6。

那么,做到这一点的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

您必须使用宏来确保使用:

extern "C" void __declspec(dllexport) __stdcall f();

构建DLL时

extern "C" void __declspec(dllimport) __stdcall f();

使用DLL时。

请参阅What does this c++ class declaration mean?了解一些想法。

答案 1 :(得分:2)

大多数库使用预处理器为您完成此操作。

它们包含__declspec(dllimport/export)

的定义
#ifdef MYDLL_EXPORTS
   #define MYDLL_API __declspec(dllexport)
#else
   #define MYDLL_API __declspec(dllimport)
#endif

void MYDLL_API __stdcaall f();

当库创建者构建DLL时,他们定义MYDLL_EXPORTS并导出函数,当客户端包含未定义的头文件时,他们将导入函数。

答案 2 :(得分:0)

如果您的DLL仅导出未修饰的C函数(extern "C"),则可以跳过所有非标准属性并使用.DEF文件导出必要的函数。如果您的DLL提供少量与C兼容的API,这是一个不错的选择。

理论上,您可以使用带有修饰函数(包括C ++成员函数)的.DEF文件,但它通常不值得付出努力。首先必须弄清楚每个函数是如何装饰(损坏)然后手动将它们添加到.DEF文件中。

如果要导出C ++接口,则需要使用__declspec(dllexport)__declspec(dllimport),如其他答案所示。