使用 __declspec(dllexport) 从 DLL 导出
2008-11-23 17:56
441 查看
使用 __declspec(dllexport) 从 DLL 导出
更新:2007 年 11 月
Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib 文件中。然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。
在更新的编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用 .def 文件。
当试图导出 C++ 修饰函数名时,这种便利最明显。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。
许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。不过,在 .def 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。
若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明中。若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:
__declspec(dllexport) 将函数名存储在 DLL 的导出表中。如果希望优化表的大小,请参见按序号而不是按名称从 DLL 导出函数。
更新:2007 年 11 月
Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib 文件中。然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。
在更新的编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用 .def 文件。
当试图导出 C++ 修饰函数名时,这种便利最明显。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。
许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。不过,在 .def 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。
若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject { ... class definition ... };
生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明中。若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:
#define DllExport __declspec( dllexport )
__declspec(dllexport) 将函数名存储在 DLL 的导出表中。如果希望优化表的大小,请参见按序号而不是按名称从 DLL 导出函数。
相关文章推荐
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- 【MSDN】使用 __declspec(dllexport) 从 DLL 导出
- C++静态库中使用_declspec(dllexport) 不能导出函数的问题
- Visual C++ 使用 __declspec(dllexport) 从 DLL 导出 (到C#)
- 使用__declspec(export)导出C++类到DLL
- C++静态库中使用_declspec(dllexport) 不能导出函数的问题
- DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- 使用 __declspec(dllexport) 从 DLL 导出
- DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别
- class _declspec(dllexport) class_name与class _declspec(dllimport) class_name的配套使用
- 程序中使用动态连接库 && _declspec(dllexport)与_declspec(dllimport)
- 从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用
- Windows C++中__declspec(dllexport)的使用
- DLL导出函数和类的定义区别 __declspec(dllexport)
- dll导入、导出声明__declspec(dllexport) 和__declspec(dllimport)用法
- 导出函数__declspec(dllexport)
- __declspec(dllexport)的意思与DEF导出函数的区别
- __declspec(dllexport)的意思与DEF导出函数的区别
- Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport)