资源描述:
《在函数前面加上WINAPI、CALLBACK》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一直搞不懂为什么在函数前面加上WTNAPT、CALLBACK等是什么意思又不是返回值为什么加在前血今天终于知道了这是一个呼叫声明(姑且称之吧)。引子:看看这个函数:intPASCALWinMain(HINSTANCEhlnst,HINSTANCEhPrev,LPSTRszCmdLine,intsw){MSGmsg;//进行程序的初始化工作if(!AppInit(hlnst,hPrev,sw))returnFALSE;〃消息循环处理for(;;){wh订e(PeekMessage(&msg,NULL,0,0,PMREMOVE))//Peek只是査
2、看事件,一般不作任何处理//Get会做一些例行处理,并且把事件从队列中删除掉(WM_PATNT除外)//通常先peek,看某事件是否存在,再get,进行处理//未经严格测试:如果你get某个在队列中不存在的事件,程序会陷入等待,但是peek总是立即返回{if(msg.message==WM_QUIT)break;//LeavethePeekMessagewhile()loop//TranslateAccelerator将WMKEYDOWN和WMSYSYKEYDOWN消息翻译成为WMCOMMAND消息,〃然后直接将消息送到相关的窗口过程中去,直到
3、消息被处理后才返凹值if(Trans1ateAccelerator(ghwndApp,ghAccel,&msg))continue;TranslateMessage(&msg);DispatchMessage(&msg);if(msg.message==WMQUIT)break;//Leavethefor()1oopWaitMessageO;//当木窗口的消息序列中没有消息的时候,将控制权交给其他的线程直到再次有消息进入自己的消息队列中时才返回}//ReachedonWM_QUITmessageCoUninitializeO;return((i
4、nt)msg・wParam);}别的先别看,现看看这个PASCAL:The__pascal,_fortran,and__syscallcallingconventionsarenolongersupported.Youcanemulatetheirfunctiona]itybyusingoneofthesupportedcallingconventionsandappropriatelinkeroptions.WINDOWS.HnowsupportstheWINAPImacro,whichtranslatestotheappropriateca
5、llingconventionforthetarget.UseWINAPIwhereyoupreviouslyusedPASCALor_far_pasca1.看来现在用WINAPI来代替己经不用的PASCAL了,那么WINAPI是什么呢?WINAPI:查看WINAPI的定义:(WINDOWS.H)^defineWINAPIFARPASCALWINAPI:UseinplaceofFARPASCALinAPIdeclarations・IfyouarewritingaDLLwithexportedAPIentrypoints,youcanusethi
6、sforyourownAPIs・原来是个宏定义。用法也说到了,你可以使用W1NAP1来为H己的API写一个DLL文件(有导出的API入口点的DLL,废话,没有API入口,要DLL干什么?)。消息处理断数就是这么定义的:LONGWINAPIAppWndProc(IIWNDhwnd,UINTmsg,WPARAMwParam,LPARAM1Param){}在VC++6.0中,WINDEF.httdefineWINAPICDECL//二_cdecl#defineCALLBACKPASCAL//=_pascal,VC已经不支持直接使用_pascal了顺便
7、提FCALLBACK:CALLBACK:UseinplaceofFARPASCALinapplicationcallbackroutinessuchaswindowproceduresanddialogprocedures.在BCB(BolandC++Builder)中:winde匚h#defineWINAPIstdcallSdefineCALLBACKstdcall具体来说,他们是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?简单说明:_cdecl是C/C++和MFC程序默认使用的调用约定,也
8、可以在函数声明时加上_cdec1关键字來手工指定。采用_cdec1约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数睡出栈以清理堆栈。因此