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

标签: dll c++
1045人阅读 评论(0) 收藏 举报

 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导出函数时就不会出现名字改编的问题了
查看评论

VS2015用C++创建的动态库导出函数名乱码原因分析

在上一篇博客【在VS2015中用C++创建动态库并用C#调用】中提到,在C# DllImport导入C/C++编写的动态库时函数,要加上CallingConvention = CallingConve...
  • songyi160
  • songyi160
  • 2016年02月27日 10:59
  • 2940

C#调运C++的DLL返回中文字符串乱码问题

C++ DLL extern "C" __declspec(dllexport) char* GetStr() { string s1 = "大大"; char *data; int len =...
  • BleuRever
  • BleuRever
  • 2016年12月02日 10:10
  • 7365

dll 导出函数名的那些事

经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。 VC+...
  • zengraoli
  • zengraoli
  • 2013年08月09日 16:31
  • 2611

动态链接库DLL导出函数名字改编问题

1、使用_declspec(dllexport)   extern "C" 可解决C++和C语言之间相互调用时函数命名的问题,但不能导出类成员函数 2、Delphi 使用标准调用约定   _staca...
  • ab7253957
  • ab7253957
  • 2015年11月29日 01:51
  • 355

C++编译时函数名修饰约定规则和DLL中导出函数的方法

C++编译时函数名修饰约定规则:   __stdcall调用约定:   1、以"?"标识函数名的开始,后跟函数名;   2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;   ...
  • ayw_hehe
  • ayw_hehe
  • 2011年11月14日 15:47
  • 1782

函数在lib和dll中的命名规则

这两天研究Dll和Lib的创建和使用看到一篇文章很不错.下面是摘录一部分 修饰名(Decoration name)   “C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译...
  • xiexievv
  • xiexievv
  • 2011年08月28日 23:03
  • 2123

DLL导出类和导出函数

1、动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用的类或者函数需要进行导出。 2、首先编写需要导出的DLL,新建一个工程设置应用程序类型为DLL 3、类的代码如下 ...
  • goodluckMT
  • goodluckMT
  • 2016年09月28日 16:05
  • 5126

dll 导出函数名的那些事

关键字: VC++  DLL  导出函数  经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出...
  • qq_16209077
  • qq_16209077
  • 2016年07月21日 23:57
  • 15086

解决DLL导出函数的名字改编问题

http://lukas06.blog.sohu.com/94010246.html
  • cocoasprite
  • cocoasprite
  • 2014年10月18日 10:31
  • 1255

DLL 函数导出的规则和方法

//在编程c++dll时  extern "C"和.def的作用  extern "c"是c++编译器在编译函数时以c编译器的方式处理函数名  而.def的作用也是告知编译器以.def导出的...
  • xiaominggunchuqu
  • xiaominggunchuqu
  • 2017年06月01日 23:54
  • 1466
    个人资料
    等级:
    访问量: 2583
    积分: 36
    排名: 192万+
    文章分类
    文章存档