c中dll函数的导出和导入

c中dll函数的导出和导入

ID:8807808

大小:54.50 KB

页数:8页

时间:2018-04-08

c中dll函数的导出和导入_第1页
c中dll函数的导出和导入_第2页
c中dll函数的导出和导入_第3页
c中dll函数的导出和导入_第4页
c中dll函数的导出和导入_第5页
资源描述:

《c中dll函数的导出和导入》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、1.使用DEF文件从DLL导出模块定义(.def)文件是包含一个或多个描述DLL各种属性的Module语句的文本文件。如果不使用__declspec(dllexport)关键字导出DLL的函数,则DLL需要.def文件。.def文件必须至少包含下列模块定义语句:文件中的第一个语句必须是LIBRARY语句。此语句将.def文件标识为属于DLL。LIBRARY语句的后面是DLL的名称。链接器将此名称放到DLL的导入库中。EXPORTS语句列出名称,可能的话还会列出DLL导出函数的序号值。通过在函数名的后面加上@符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从1到N,其中N

2、是DLL导出函数的个数。如果希望按序号导出函数,请参见按序号而不是按名称从DLL导出函数以及本主题。例如,包含实现二进制搜索树的代码的DLL看上去可能像下面这样:LIBRARYBTREEEXPORTSInsert@1Delete@2Member@3Min@4如果使用MFCDLL向导创建MFCDLL,则向导将为您创建主干.def文件并将其自动添加到项目中。添加要导出到此文件的函数名。对于非MFCDLL,必须亲自创建.def文件并将其添加到项目中。如果导出C++文件中的函数,必须将修饰名放到.def文件中,或者通过使用外部“C”定义具有标准C链接的导出函数。如果需要将修饰名放到.def文件中

3、,则可以通过使用DUMPBIN工具或/MAP链接器选项来获取修饰名。请注意,编译器产生的修饰名是编译器特定的。如果将VisualC++编译器产生的修饰名放到.def文件中,则链接到DLL的应用程序必须也是用相同版本的VisualC++生成的,这样调用应用程序中的修饰名才能与DLL的.def文件中的导出名相匹配。如果生成扩展DLL并使用.def文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:#undefAFX_DATA#defineAFX_DATAAFX_EXT_DATA//#undefAFX_DATA#defineAFX_DATA这些

4、代码行确保内部使用的MFC变量或添加到类的变量是从扩展DLL导出(或导入)的。例如,当使用DECLARE_DYNAMIC派生类时,该宏扩展以将CRuntimeClass成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接DLL,或在客户端应用程序链接到DLL时导致错误。当生成DLL时,链接器使用.def文件创建导出(.exp)文件和导入库(.lib)文件。然后,链接器使用导出文件生成DLL文件。隐式链接到DLL的可执行文件在生成时链接到导入库。请注意,MFC本身使用.def文件从MFCx0.dll导出函数和类。1.使用_declspec(dllexport)从DLL导出Micro

5、soft在VisualC++的16位编译器版本中引入了_export,使编译器得以自动生成导出名并将它们放到一个.lib文件中。然后,此.lib文件就可以像静态.lib那样用于与DLL链接。在更新的编译器版本中,可以使用_declspec(dllexport)关键字从DLL导出数据、函数、类或类成员函数。_declspec(dllexport)会将导出指令添加到对象文件中,因此您不需要使用.def文件。当试图导出C++修饰函数名时,这种便利最明显。由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。如果使用_declspec(dllexport),仅当解决任何

6、命名约定更改时才必须重新编译DLL和依赖.exe文件。许多导出指令(如序号、NONAME和PRIVATE)只能在.def文件中创建,并且必须使用.def文件来指定这些属性。不过,在.def文件的基础上另外使用_declspec(dllexport)不会导致生成错误。若要导出函数,_declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:_declspec(dllexport)void_cdeclFunction1(void);若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:class_declspec(dlle

7、xport)CExampleExport:publicCObject{...classdefinition...};生成DLL时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将_declspec(dllexport)添加到头文件中的声明中。若要提高代码的可读性,请为_declspec(dllexport)定义一个宏并对正在导出的每个符号使用该宏:#defineDllExport_declspec(dllexport)_de

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。