文档章节

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

alexChan
 alexChan
发布于 2017/05/23 11:49
字数 926
阅读 13
收藏 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"。

  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的应用程序也使用该宏输入类。

本文转载自:

共有 人打赏支持
alexChan

alexChan

粉丝 9
博文 19
码字总数 4981
作品 0
福州
程序员
__declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定

DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数: 生成 DLL 时使用模块定义 (.DEF) 文件。 在主应用程序的函数定义中使用 declspec(dllimport) 或 declspec(dllexport) 关...

AlphaJay
2010/08/20
0
0
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是cdecl方式,而windows API则是std...

AlphaJay
2010/08/20
0
1
extern "C" __declspec(dllexport) __declspec(dll...

extern "C" declspec(dllexport) declspec(dllimport) 和 def前面的extern "C" declspec(dllexport) declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern "C"放在class......

IMGTN
2012/06/26
0
0
_cdecl、_stdcall、_fastcall和_thiscall整理

cdecl、stdcall、fastcall和thiscall整理 1._cdecl是C Declaration的缩写,表示C语言默认的函数调用方法:所有参数 从右到左依次入栈,这些参数由调用者清除,称为手动清栈(由调用者把参数弹...

西昆仑
2011/11/17
0
1
WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,n

被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(fastcall的前面部分由ecx,edx传), 函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。 1、_stdcall是Pascal程...

guoliang
2014/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微信小程序页面栈管理

页面路由 在小程序中所有页面的路由全部由框架进行管理。 页面栈 框架以栈的形式维护了当前的所有页面。当发生路由切换的时候,页面栈的表现如下: 路由方式 页面栈表现 初始化 新页面入栈 ...

昙花一现
33分钟前
2
0
es6 let使用总结

中午偷个闲做个es6let的使用总结 作用域块 在作用域块中声明的变量不受外部的影响,见例子 {let a= 10;{let a= 20;console.log('子作用域', a);// 20}console.log('父作用域', a);// 10...

莫西摩西
35分钟前
0
0
ppwjs之bootstrap文字排版:排版常量

$bootstrap.字体.加粗类 = "font-weight-bold";$bootstrap.字体.普通类 = "font-weight-normal";$bootstrap.字体.纤细类 = "font-weight-light";$bootstrap.字体.斜体类 = "font-ital......

ppwjs
38分钟前
0
0
macOS Mojave 去除 Dock 栏最近打开的 App

升级 macOS Mojave 正式版后,每打开一个 App ,关闭后在 Dock 栏仍会保留下来,并与“钉”在 Dock 栏的那些常驻 App 以一个分割线隔开,这与 iPad 上类似,但是在 mac 下此功能显得十分别扭...

whoru
42分钟前
4
1
在Debian 9系统上安装Mysql数据库的方法教程

前言 看到题目大家应都会想,在 Debian 9 上安装 Mysql?那不是很简单的事儿吗?直接 sudo apt install mysql-server 不就行了吗? 没想到遇到了几个之前没遇到的问题,耽误了不少时间。 原来...

临江仙卜算子
今天
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部