C++中DLL函数的导出和导入.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C++中DLL函数的导出和导入.doc》由会员分享,可在线阅读,更多相关《C++中DLL函数的导出和导入.doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、使用 DEF 文件从 DLL 导出模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 _declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。.def 文件必须至少包含下列模块定义语句:文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 符和一个数字,给函数分配序号值
2、。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。如果希望按序号导出函数,请参见按序号而不是按名称从 DLL 导出函数以及本主题。例如,包含实现二进制搜索树的代码的 DLL 看上去可能像下面这样:LIBRARY BTREEEXPORTS Insert 1 Delete 2 Member 3 Min 4如果使用 MFC DLL 向导创建 MFC DLL,则向导将为您创建主干 .def 文件并将其自动添加到项目中。添加要导出到此文件的函数名。对于非 MFC DLL,必须亲自创建 .def 文件并将其添加到项目中。如果导出 C+ 文件中的函数,必须将修饰名放到
3、 .def 文件中,或者通过使用外部“C”定义具有标准 C 链接的导出函数。如果需要将修饰名放到 .def 文件中,则可以通过使用 DUMPBIN 工具或 /MAP 链接器选项来获取修饰名。请注意,编译器产生的修饰名是编译器特定的。如果将 Visual C+ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C+ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。如果生成扩展 DLL 并使用 .def 文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:#undef AFX_DATA#define
4、 AFX_DATA AFX_EXT_DATA/ #undef AFX_DATA#define AFX_DATA这些代码行确保内部使用的 MFC 变量或添加到类的变量是从扩展 DLL 导出(或导入)的。例如,当使用 DECLARE_DYNAMIC 派生类时,该宏扩展以将 CRuntimeClass 成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接 DLL,或在客户端应用程序链接到 DLL 时导致错误。当生成 DLL 时,链接器使用 .def 文件创建导出 (.exp) 文件和导入库 (.lib) 文件。然后,链接器使用导出文件生成 DLL 文件。隐式链接到 DLL 的可执行文件在生成
5、时链接到导入库。请注意,MFC 本身使用 .def 文件从 MFCx0.dll 导出函数和类。使用 _declspec(dllexport) 从 DLL 导出Microsoft 在 Visual C+ 的 16 位编译器版本中引入了 _export,使编译器得以自动生成导出名并将它们放到一个 .lib 文件中。然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。在更新的编译器版本中,可以使用 _declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。_declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用
6、.def 文件。当试图导出 C+ 修饰函数名时,这种便利最明显。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用 _declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译 DLL 和依赖 .exe 文件。许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些属性。不过,在 .def 文件的基础上另外使用 _declspec(dllexport) 不会导致生成错误。若要导出函数,_declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果
7、指定了关键字)。例如:_declspec(dllexport) void _cdecl Function1(void);若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:class _declspec(dllexport) CExampleExport : public CObject . class definition . ;生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 _declspec(dllexport) 添加到头文件中的声明中。若要提高代码的可读性,请为 _declspec(dllexport) 定义一个宏并对正在导出的每
8、个符号使用该宏:#define DllExport _declspec( dllexport ) _declspec(dllexport) 将函数名存储在 DLL 的导出表中。如果希望优化表的大小,请参见按序号而不是按名称从 DLL 导出函数。注意:将 DLL 源代码从 Win16 移植到 Win32 时,请用 _declspec(dllexport) 替换 _export 的每个实例。作为参考,请在 Win32 Winbase.h 头文件中搜索。它包含 _declspec(dllimport) 的用法示例。使用 AFX_EXT_CLASS 导出和导入扩展 DLL 使用 AFX_EXT_CLA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ DLL 函数 导出 导入
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内