您的位置:首页 > 其它

DLL(动态库)导出函数名乱码含义

2016-01-22 00:54 190 查看


 C++编译时函数名修饰约定规则:    

  __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++类是很麻烦的,并且这个修饰名是不可避免的

C++编译器的命名规则是这样的:

因为c++支持函数名重载,所以编译器会根据自己的规则对函数名进行篡改,防止命名发生冲突。

解决办法是在你dll的.cpp 和.h头文件中在函数前 加关键字_stdcall

或者在.def文件中直接指定导出的函数名

这样你再用depends或者exescope 看dll导出函数时就不会出现名字改编的问题了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: