约定规则如下。
? 以“?”标识函数名的开始,后跟函数名。
? 函数名后面以“@@YG”标识参数表的开始,后跟参数表。
? 参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型。
? 参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。
其格式为“?functionncom@@YG*****@Z”或“?functionncom@@YG*XZ”,例如:
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”,void Test2()-----
“?Test2@@YGXXZ”。
cdecl 调用约定规则同上面的stdcall 调用约定类似,只是参数表的开始标识由上面的
“@@YG”变为“@@YA”。
fastcall 调用约定规则同上面的stdcall 调用约定,只是参数表的开始标识由上面的
“@@YG”变为“@@YI”。
3.得到没有修饰的函数名
Visual C++ 输出函数时使用_declspec(dllexport) , 而不再用_export 修饰字。
_declspec(dllexport)在C 调用约定、C 编译情况下可以去掉输出函数名的下划线前缀。extern
"C"使得在C++中使用C 编译方式成为可能,在一个C++文件中,用extern "C"来指明该函数
使用C 编译方式。例如,在一个C++文件中,有如下函数:
extern "C" {void __declspec(dllexport) __cdecl Test(int var);}
其输出函数名为Test。
为了方便,可以使用下列预处理语句:
#if defined(__cplusplus)
extern "C"
{
#endif
//函数原型说明
#if defined(__cplusplus)
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·264·
}
#endif
经过上面的特殊处理,不管在C 中,还是在C++中都可以得到一个无任何修饰的函数名。
如果不用_declspec(dllexport)修饰字输出函数,而用DEF 文件来输出函数。将要输出的
函数修饰名罗列在EXPORTS 之下,这个名字必须与定义函数的名字完全一致,如此就得到
一个没有任何修饰的函数名了。
10.4.4 模块定义文件(DEF 文件)
模块定义文件(DEF)是一个或多个用于描述DLL 属xìng的模块语句组成的文本文件,每
个DEF 文件至少必须包含以下模块定义语句。
? 第一个语句必须是LIBRARY 语句,指出DLL 的名字;
? EXPORTS 语句列出被导出函数的名字;将要输出的函数修饰名罗列在EXPORTS
松语文学免费小说阅读_www.16sy.com