关闭

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

标签: dllc++
803人阅读 评论(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导出函数时就不会出现名字改编的问题了
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

关于DLL函数名导出名字命名规则

http://blog.csdn.net/yscdaxian/article/details/5933379 使用Dependency看DLL的导出函数的名字,会发现有一些有意思的东西,这大多是...
  • beiguoshuo
  • beiguoshuo
  • 2014-06-06 11:15
  • 1424

dll 导出函数名的那些事

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

DLL导出函数名称改编的解决方法

1.DLL编译后导出函数名称改编   在编写一个DLL后,为了能被别的程序调用,需要将被使用的函数导出; 但是一般的编译器都会将到处函数名称改编; 例如:在VC中新建一个空的win32 dll...
  • aidem_brown
  • aidem_brown
  • 2014-08-20 21:36
  • 1431

关于Dll 导出函数名(ZZ)

http://blog.csdn.net/conanlrj/article/details/5797549 使用Dependency看DLL的导出函数的名字,会发现有一些有意思的东西,这大多是和...
  • chenzhisi
  • chenzhisi
  • 2013-12-05 16:10
  • 874

DLL头文件的格式和应用

1、DLL的起源   动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代...
  • Genius_LG
  • Genius_LG
  • 2014-01-24 10:39
  • 1273

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

http://lukas06.blog.sohu.com/94010246.html
  • cocoasprite
  • cocoasprite
  • 2014-10-18 10:31
  • 1096

DLL中导出函数的两种方式

DLL中导出函数的两种方式(dllexport与.def文件)(2009-03-06 11:34:58) 标签:dll 导出函数 两种方式 __declspec dllexport .def 文件 i...
  • yushiqiang1688
  • yushiqiang1688
  • 2010-01-17 20:49
  • 38520

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

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

dll 导出函数名的那些事

经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。 VC+...
  • zengraoli
  • zengraoli
  • 2013-08-09 16:31
  • 2412
    个人资料
    • 访问:2135次
    • 积分:33
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:7篇
    • 译文:0篇
    • 评论:0条