__stdcall约定
来源:互联网 发布:stp 查看环路端口 编辑:程序博客网 时间:2024/06/05 02:33
__stdcall约定
如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):
在lib.h中,应这样声明add函数:
在应用工程中函数指针类型应定义为:
若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出如图7所示的对话框。
如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):
#define CALLBACK __stdcall //这就是传说中的回调函数
#define WINAPI __stdcall //这就是传说中的WINAPI
#define WINAPIV __cdecl
#define APIENTRY WINAPI //DllMain的入口就在这里
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
在lib.h中,应这样声明add函数:
int __stdcall add(int x, int y);
在应用工程中函数指针类型应定义为:
typedef int(__stdcall *lpAddFun)(int, int);
若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出如图7所示的对话框。
图7 调用约定不匹配时的运行错误
图8中的那段话实际上已经给出了错误的原因,即“This is usually a result of …”。
http://pcedu.pconline.com.cn/empolder/gj/vc/0509/699672_6.html
- __stdcall约定
- __stdcall约定
- __stdcall约定
- __STDCALL约定
- 调用约定__stdcall / __cdecl
- __stdcall调用约定
- __cdecl与 __fastcall与 __stdcall调用约定
- __cdecl与 __fastcall与 __stdcall调用约定
- __cdecl __fastcall与 __stdcall 调用约定
- 函数调用约定__stdcall与__cdecl
- __cdecl __stdcall各种调用约定详解
- C++常用的调用约定__cdecl &__stdcall
- 函数调用约定:__cdecl,__stdcall,__fastcall,__thiscall
- 函数的调用约定 __stdcall __cdecl __fastcall
- 函数调用约定 __cdecl __fastcall __stdcall
- __cdecl __fastcall与 __stdcall 调用约定
- __stdcall和__cdecl调用约定及名称改编约定
- 函数命名规则及调用约定(__cdecl,__stdcall,__fastcall)
- oracle 内连接(inner join)、外连接(outer join)、全连接(full join)
- 从一个错误谈谈事务管理
- 电能质量监测装置人机界面的实现
- sasa
- Ext.data.Store动态修改url
- __stdcall约定
- 一分钟制作U盘版BT3 - 有图滴儿 bt3破解教程
- POJ2752 Seek the Name, Seek the Fame
- 多目运算符
- ZOJ 1084 Channel Allocation
- 一些网址
- MFC获取文档属性
- 直接在包中创建用例
- 电能质量监测装置界面实例