代码改变世界

【转载】关于C++的动态库导出函数名乱码的规则

2009-08-12 09:30  码农.KEN  阅读(906)  评论(0编辑  收藏  举报
在C#中使用DllImport调用C++的动态库时,发现直接使用DLL中的函数名作为入口点·会出错,找不到该入口点。通过工具查看DLL后才发现所有函数名都变成“乱码”了;
不过这些都不是乱码,而是有规则的。现转载一篇规则说明,在此感谢原作者。

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"。