dll导出方法:__declspec(dllexport) ,def文件
一,__ declspec(dllexport):
将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。通常它和extern“C”合用,形式如下:
extern "C"
{
__declspec(dllexport) void FUNCTION()
{
}
}
这是由于在制作DLL导出函数时由于C ++存在函数重载,因此__declspec(dllexport)FUNCTION(int,int)在DLL会被装饰,例如被装饰成为function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress的的取得FUNCTION地址时的不便,使用外部的“C”时,上述的装饰不会发生,因为ç没有函数重载,如此一来被外部的“C”修饰的函数,就不具备重载能力。
二,MSDN:
“在32位编译器版本中,可以使用__declspec(dllexport)关键字从DLL导出数据,函数,类或类成员函数.__ declspec(dllexport)将导出指令添加到对象文件(即obj文件) ,若要导出函数,__ 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)与.def
模块定义(.def)文件是包含一个或多个描述各种DLL属性的模块语句的文本文件
.1,二者的目的都是将公共符号导入到应用程序中或从DLL导出函数
.2,添加__declspec(dllexport)是为了提供不使用.def文件从.EXE或.DLL导出函数的简单方法
.3,如果不使用__declspec(dllimport)或__declspec(dllexport)导出DLL函数,则DLL需要.def文件
.4,并不是任何时候选择添加__declspec(dllexport)而放弃.def的方式都是好的。如果DLL是提供给VC ++用户使用的,只需要把编译DLL时产生的。 lib提供给用户,它可以很轻松地调用你的DLL。但是如果DLL是供VB,PB,Delphi用户使用的,那么会产生一个小麻烦。因为VC ++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:__ declspec
(dllexport)int __stdcall IsWinNT()
会转换为IsWinNT @ 0,这样你在VB中必须这样声明:
声明函数IsWinNT Lib“my.dll”别名“IsWinNT @ 0”()As Long
@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.DEF文件方式。
上一篇: 全方位解读DLL文件—调用DLL
下一篇: dll的加载