C++编译时函数名修饰约定规则:
__stdcall调用约定:
一、以"?"标识函数名的开始,后跟函数名;
二、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
三、参数表以代号表示:
X--void ,
D--char,
E--unsigned char,
F--short,
H--int,
I--unsigned int,
J--long,
K--unsigned long,
M--float,
N--double,
_N--bool,
....
PA--表示指针,后面的代号代表指针类型,若是相同类型的指针连续出现,以"0"代替,一个"0"表明一次重复;
四、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
五、参数表后以"@Z"标识整个名字的结束,若是该函数无参数,则以"Z"标识结束。
其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
void Test2() -----“?Test2@@YGXXZ”
__cdecl调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。
__fastcall调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。
DLL中导出函数的方法
从DLL中导出函数通常有三种方法:
1 使用DEF文件,它是一个包含描述动态连接库不一样属性模块语句的文本文件,若是在程序中不使用_declspec(dllexport)关键字输出DLL函数,则必须有一个DEF文件。
DEF文件中通常包含如下的语句:
NAME:主输出程序或动态连接库文件名
LIBRARY:该语句指出动态连接库的内部名字,只是链接器生成动态连接库。
DESCRIPTION:描述DLL的用途,用单引号或双引号包含。
STACKSIZE:以字节为单位设置堆栈的大小
SECTIONS:设置段属性
EXPORTS:列出DLL导出函数名和其余信息。
VERSION:给出DLL版本号
对于使用AppWizard建立的MFC DLL,AppWizard会建立一个DEF文件的框架,并自动增长到工程中,而后在DEF文件中添加用于输出的函数。若是是建立非MFC DLL,必须本身建立DEF文件,并添加到工程总。
当创建DLL时,链接器会使用DEF文件建立一个输出EXP文件和一个输入库LIB,而后链接器会利用这些输出文件创建动态连接库文件,使用动态连接库的可执行程序能够显示的链接LIB文件来使用DLL文件。
2 使用_declspec(dllexport)关键字
可使用_declspec(dllexport)关键字从动态连接库中输出函数,数据,类或是类成员,使用该关键字就再也不使用DEF文件。
当要从动态连接库中输出函数时,_declspec(dllexport)关键字必须放置在输出变量的前面,当创建一个新的动态连接库文件时,通常会建立一个包含输出函数原形或函数类的头文件,而后再头文件中加上_declspec(dllexport)关键字声明,在使用上述的动态连接库的输出函数时,就能够利用_declspec(dllimport)关键字来声明使用的Dll输出函数,而后能够直接使用这些函数。
3 针对MFC扩展函数,它使用AFX_EXT_CLASS宏来导出类。
MFC扩展DLL使用AFX_EXT_CLASS宏输出类,而使用扩展DLL的应用程序也使用该宏输入类。框架