https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx

https://msdn.microsoft.com/zh-cn/library/ms235636.aspx

 

 

可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数:

  • 生成 DLL 时使用模块定义 (.def) 文件

  • 在主应用程序的函数定义中使用关键字 __declspec(dllimport)__declspec(dllexport)

如果不使用 __declspec(dllimport)__declspec(dllexport) 导出 DLL 函数,则 DLL 需要 .def 文件。

从 DLL 导出。

Visual C++ 用 __declspec(dllimport)__declspec(dllexport) 取代以前在 16 位版的 Visual C++ 中使用的 __export 关键字。

但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

添加 __declspec(dllexport) 是为了提供不使用 .def 文件从 .exe 或 .dll 文件导出函数的简单方法。

这使得加载程序在访问这些导入时可以只修改一两页。

 

 

 

 

 

然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。

__declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用 .def 文件。

如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。

不过,在 .def 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。

例如:

 
__declspec(dllexport) void __cdecl Function1(void);

若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:

 
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
说明

__clrcall 调用约定的函数。

若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:

 
#define DllExport   __declspec( dllexport ) 

按序号而不是按名称从 DLL 导出函数。

说明

将 DLL 源代码从 Win16 移植到 Win32 时,请用 __declspec(dllexport) 替换 __export 的每个实例。

相关文章: