WINAPI宏

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了 这是一个呼叫声明(姑且称之吧)。

引子:

看看这个函数:

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
{
     MSG msg;

    
//进行程序的初始化工作
     if(!AppInit(hInst,hPrev,sw))
         return FALSE;

    
//消息循环处理
     for(;;)
     {
         while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))//Peek只是查看事件,一般不作任何处理
                          //Get会做一些例行处理,并且把事件从队列中删除掉(WM_PAINT除外)

                    //通常先peek,看某事件是否存在,再get,进行处理

                   //未经严格测试:如果你get某个在队列中不存在的事件,程序会陷入等待,但是peek总是立即返回

         {
             if(msg.message == WM_QUIT)
                 break;   // Leave the PeekMessage while() loop
     //TranslateAccelerator将WM_KEYDOWN和WM_SYSYKEYDOWN消息翻译成为WM_COMMAND消息,
//然后直接将消息送到相关的窗口过程中去,直到消息被处理后才返回值
             if(TranslateAccelerator(ghwndApp, ghAccel, &msg))
                 continue;

             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }

         if(msg.message == WM_QUIT)
             break;   // Leave the for() loop

         WaitMessage();//当本窗口的消息序列中没有消息的时候,将控制权交给其他的线程直到再次有消息进入自己的消息队列中时才返回
     }

     // Reached on WM_QUIT message
     CoUninitialize();
     return ((int) msg.wParam);
}

别的先别看,现看看这个PASCAL :

The __pascal, __fortran, and __syscall calling conventions are no longer supported. You can emulate their functionality by using one of the supported calling conventions and appropriate linker options.

WINDOWS.H now supports the WINAPI macro, which translates to the appropriate calling convention for the target. Use WINAPI where you previously used PASCAL or __far __pascal.

看来现在用WINAPI来代替己经不用的PASCAL了,那么WINAPI是什么呢?

WINAPI:

查看WINAPI的定义:(WINDOWS.H)

#define WINAPI FAR PASCAL

WINAPI:Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API entry points, you can use this for your own APIs.  

原来是个宏定义。用法也说到了,你可以使用WINAPI来为自己的API写一个DLL文件(有导出的API入口点的DLL,废话,没有API入口,要DLL干什么?)。

消息处理函数就是这么定义的:LONG WINAPI   AppWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){}

在VC++ 6.0中,WINDEF.h   

#define WINAPI       CDECL //=_cdecl

#define CALLBACK     PASCAL //=_pascal,VC已经不支持直接使用_pascal了

顺便提下CALLBACK:CALLBACK:Use in place of FAR PASCAL in application callback routines such as window procedures and dialog procedures.

在BCB(Boland C++ Builder )中:windef.h   

#define WINAPI       __stdcall

#define CALLBACK     __stdcall

具体来说,他们是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?

简单说明:

__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
__stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
__fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。

特别说明:
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
4. VC下和BCB下对WINAPI的定义不同,所以不能直接从BCB下调用VC的dll的一个原因了。

看来WINAPI与DLL关系很密切,所以还应该探讨一下DLL啊。下次说吧。

使用定义文件和WINAPI编写自己的API动态库     如果你想要自己编写的动态库可以适用更多的其它编程语言,你可以使用定义文件和WINAPI来编写自己的API动态库。你将会发现,使用这样的动态库输出函数就象使用API函数一样。        一、为什么要使用DEF文件?    因为微软的MFC动态库都是使用DEF文件创建的。    这回答够有份量吧,但有点大帽子压人的感觉。下面呢,我从原理上来说说为什么要使用DEF文件。    无论使用C语 阅读详情

相关推荐

C++学习笔记————WINAPI定义

在学习时,发现有一个代码实例中的方法函数定义如下: DWORD WINAPI Fun(LPVOID lpParamter) { for (int i = 0; i < 10; i++) cout << "A Thread Fun Display!" << endl; return 0L; } DWORD之前在OCX控件中接触过了,是windows环境中定义的数据类型,本质就是 unsigned int 型,但是后面的WINAPI之前并没有接...

OmuziO的博客 6328

0811时间

时间

JokesForJoker的博客 239

WINAPI、__cdecl、__stdcall、__fastcall

一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了 这是一个呼叫声明(姑且称之吧)。 引子: 看看这个函数: int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) { MSG msg; /* Call initiali

TXH0001的专栏 2056

从0开始的WinAPI学习(2)——常用的字符串处理函数

认识一下以后可能用到的字符串处理函数

noobxiaomeng的博客 2136

WINAPI和几种调用约定

在VC SDK的WinDef.h中,WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall。这些调用约定会对我们的代码产生什么样的影响?让我们逐个分析。 首先,在x86平台上,用VC编译这样一段代码: 1 int __cdecl TestC(int n0, int n1, int n2, int n3, int n4,

356

Qt调用winapi时,涉及到UNICODE问题

在Qt默认UNICODE编码,在调用WINAPI时会涉及到UNICODE问题,此时在.pro文件中添加: DEFINES -= UNICODE 即可屏蔽掉UNICODE调用函数

拾予的博客 614

WINAPI和CALLBACK这两个有什么区别

WINAPI和CALLBACK这两个有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported AP

ysr1980的专栏 1130

WINAPI和CALLBACK这两个【zt】

WINAPI和CALLBACK这两个 WINAPI和CALLBACK这两个有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing 

眼界决定世界 奋斗成就梦想 696

【转载】WINAPI

原文:http://blog.sina.com.cn/s/blog_3f27dee60100qi4j.html 一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了 这是一个呼叫声明(姑且称之吧)。 引子: 看看这个函数: int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev...

weixin_34356555的博客 88

WINAPI和CALLBACK这两个有什么区别呢?还关于stdcall和cdecl的区别

结果对于我这样一个普通程序员,估计那么点开销,不会去关注!关于需要Dll导出的class,需要加特别的API的。 WINAPI和CALLBACK这两个 _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCA

sh_chenjian的专栏 1069

C++ CALLBACK和WINAPI两个的含义?

在编程时,也许你会看到函数声明或定义中会出现CALLBACK和WINAPI两个。其实,它们也是__stdcall的代名词。看windef.h中的内容: #define CALLBACK __stdcall #define WINAPI __stdcall __stdcall是调用类型.调用类型有:__fastcall、__cdecl、_...

weixin_34233421的博客 561

WINAPI和CALLBACK这两个有什么区别呢?

<br />WINAPI和CALLBACK这两个有什么区别呢?<br /><br />_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?<br /><br /><br />首先看MSDN里给出的解释,不过有些语焉不详哦<br /><br />WINAPI <br />·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API ent

Dolly2012的专栏 712

WINAPI和CALLBACK这两个说开去

从bbs上看到有同学问这个问题,因此回答了这个帖子。 WINAPI和CALLBACK这两个有什么区别呢?_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCAL in API declarations. If y

183

WINAPI和CALLBACK这两个说开去- -(转)

WINAPI和CALLBACK这两个有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing aDLL with

FlowShell的专栏 1384

(转)从WINAPI和CALLBACK这两个说开去- -

从bbs上看到有同学问这个问题,因此回答了这个帖子。 WINAPI和CALLBACK这两个有什么区别呢?_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCAL in API declarations

lacsis的专栏 523

WinAPI-MAKEWORD

怀念二抱三抱

文天大人 609
上一篇: vc下库文件的编写和调用
下一篇: FPC与FFC的区别
slj_win
博客等级 码龄16年 234粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值