本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

谦卑,荣誉,牺牲,英勇,怜悯,诚实,精神,公正。


我的分类(专题)

日志更新

最新评论

留言板

链接

 

 


Blog信息
blog名称:
日志总数:183
评论数量:698
留言数量:7
访问次数:3020967
建立时间:2005年12月29日




[编程学习]__stdcall约定
网上资源,  软件技术

newqiang 发表于 2005/12/31 22:15:14

__stdcall约定  如果通过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所示的对话框。 500)this.width=500'> 图7 调用约定不匹配时的运行错误   图8中的那段话实际上已经给出了错误的原因,即“This is usually a result of …”。  单击此处下载__stdcall调用例子工程源代码附件。


阅读全文(4386) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144764864 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号