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

转载 2012年10月11日 09:04:02
  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"。

  DLL中导出函数的方法
  从DLL中导出函数一般有三种方法: 
  1 使用DEF文件,它是一个包含描述动态链接库不同属性模块语句的文本文件,如果在程序中不使用_declspec(dllexport)关键字输出DLL函数,­则必须有一个DEF文件。 
  DEF文件中一般包含以下的语句: 
    NAME:主输出程序或动态链接库文件名
    LIBRARY:该语句指出动态链接库的内部名字,只是连接器生成动态链接库。 
    DESCRIPTION:描述DLL的用途,用单引号或双引号包含。 
    STACKSIZE:以字节为单位设置堆栈的大小 
    SECTIONS:设置段属性 
    EXPORTS:列出DLL导出函数名和其他信息。 
    VERSION:给出DLL版本号 
  对于使用AppWizard创建的MFC DLL,AppWizard会创建一个DEF文件的框架,并自动增加到工程中,然后在DEF文件中添加用于输出的函数。如果是创建非MFC DLL,必须自己创建DEF文件,并添加到工程总。 
当建立DLL时,连接器会使用DEF文件创建一个输出EXP文件和一个输入库LIB,然后连接器会利用这些输出文件建立动态链接库文件,使用动态链接库的可执行­程序可以显示的连接LIB文件来使用DLL文件。 
  2 使用_declspec(dllexport)关键字 
    可以使用_declspec(dllexport)关键字从动态链接库中输出函数,数据,类或是类成员,使用该关键字就不再使用DEF文件。 
    当要从动态链接库中输出函数时,_declspec(dllexport)关键字必须放置在输出变量的前面,当建立一个新的动态链接库文件时,一般会创建一个包­含输出函数原形或函数类的头文件,然后再头文件中加上_declspec(dllexport)关键字声明,在使用上述的动态链接库的输出函数时,就可以利用_­declspec(dllimport)关键字来声明使用的Dll输出函数,然后可以直接使用这些函数。 
  3 针对MFC扩展函数,它使用AFX_EXT_CLASS宏来导出类。 
    MFC扩展DLL使用AFX_EXT_CLASS宏输出类,而使用扩展DLL的应用程序也使用该宏输入类。

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名) 第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT ex...
  • thanklife
  • thanklife
  • 2017年06月30日 09:34
  • 500

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

   C++编译时函数名修饰约定规则:     __stdcall调用约定:     1、以"?"标识函数名的开始,后跟函数名;     2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;  ...
  • yc_8301
  • yc_8301
  • 2008年10月07日 09:35
  • 3433

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

C++编译时函数名修饰约定规则:2 __stdcall调用约定: 1、以“?”标识函数名的开始,后跟函数名; 2、函数名后面以“@@YG”标识参数表的开始,后跟参数表; 参数表以代号表示: X--vo...
  • ytfrdfiw
  • ytfrdfiw
  • 2007年06月04日 09:08
  • 1051

关于Dll 导出函数名(ZZ)

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

C++函数名的修饰规则

我们知道在C++中有函数重载这样一个东西,当我们定义了几个功能类似且函数名是一样的函数的时候,只要它的参数列表不同,编译是可以通过的,但是在C中是不可以的。   double add(...
  • mr_listening
  • mr_listening
  • 2016年05月21日 20:30
  • 909

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

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

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

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

函数名修饰约定规则

 文章参考了:http://blog.csdn.net/yxin1322/articles/564597.aspxhttp://hi.baidu.com/wyuanshiy/blog/item/82f...
  • Blue_Dream_
  • Blue_Dream_
  • 2007年08月30日 14:50
  • 1133

dll隐藏导出函数名

DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被...
  • songtzu
  • songtzu
  • 2014年07月29日 17:58
  • 1578

C和C++编译器的函数名修饰规则

C编译器的函数名修饰规则 :     对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数           例如_fun...
  • My_heart_
  • My_heart_
  • 2016年05月26日 15:17
  • 1174
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++编译时函数名修饰约定规则和DLL中导出函数的方法
举报原因:
原因补充:

(最多只允许输入30个字)