在dll中使用def文件定义导出函数名,保证导出“函数”名字不会前后增加其他字符。这个在论坛上或者其他地方都有大量文章说明。而且也实践成功,觉得这个方法不错.
下面是def文件的内容示意,其中Show,Go,Alert是导出“函数”的名称,用depend查看生成的dll,函数名称可以保证完全一致,不会存在前后乱字符。LIBRARY "MyDll"
DESCRIPTION 'MyDll'
EXPORTS
; Explicit exports can go here
Show
Go
Alert但是,导出“类”的时候,def文件不知道怎么写,所以只是使用了dllexport定义,但是生成的dll我用depends查看的时候,有类似如下内容
?Initialize@CMyClass@@SAXXZ
?GenerateStr@CMyClass@@QAEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0V23@@Z如果我也想使用def文件来解决这些乱字符的话,def文件该怎么写呢?
下面是def文件的内容示意,其中Show,Go,Alert是导出“函数”的名称,用depend查看生成的dll,函数名称可以保证完全一致,不会存在前后乱字符。LIBRARY "MyDll"
DESCRIPTION 'MyDll'
EXPORTS
; Explicit exports can go here
Show
Go
Alert但是,导出“类”的时候,def文件不知道怎么写,所以只是使用了dllexport定义,但是生成的dll我用depends查看的时候,有类似如下内容
?Initialize@CMyClass@@SAXXZ
?GenerateStr@CMyClass@@QAEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0V23@@Z如果我也想使用def文件来解决这些乱字符的话,def文件该怎么写呢?
__stdcall调用约定:
1、以"?"标识函数名的开始,后跟函数名;
2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
3、参数表以代号表示:
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"代表一次重复;
4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
5、参数表后以"@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"。
如果要用DEF文件输出一个"C++"类,则把要输出的数据和成员的修饰名都写入.def模块定义文件
所以... 通过def文件来导出C++类是很麻烦的,并且这个修饰名是不可避免的