首先看看MSDN給出的解釋,但是有些解釋很模糊,WINAPI。
使用於placeoffarpascalipadiclarations。如果yourewritingadlwithexportadapientrypoints,則youcanusethisforyourownAPIs。回收
useinplaceoffarpascalinapplicationcallbackroutinsuchwindow procedures和dialogprocedures。我們來看看這兩個宏的內容是什麽,VC:WINDEF.h
# definecallbackPascal/= _pascal,VC不再支持直接使用_pascal。
# defineWINAPICDECL//= _ cdeclBCB:windef . h
#defineCALLBACK__stdcall
#defineWINAPI__stdcall引出壹些可能比較少見的關鍵字,比如cdeclstdcall。那麽cdecl、pascal、stdcall、fastcall這些修飾符是什麽意思呢?
很簡單,只是壹些關於堆棧的解釋,首先是函數參數的堆棧順序,其次是
誰來清除堆棧的內容,調用者還是函數本身?
這些開關用來告訴編譯器產生哪種匯編代碼。以下區別列表如下:directiveparameteorderclean-UppercassesparameterSinRegisters?
註冊從左到右路線是
pascalLeft-to-rightRoutineNo
cdeclRight-to-leftCallerNo
stdcallRight從右向左路由否
SafecallRight-to-leftRoutineNo簡單描述:__cdecl是C/C++和MFC程序默認使用的調用約定,也可以通過在函數聲明中添加__cdecl關鍵字來手動指定。采用__cdecl約定時,函數參數從右到左放入堆棧,調用者將參數彈出堆棧以清理堆棧。因此,實現可變參數的函數只能使用這種調用約定。因為每個使用__cdecl約定的函數都包含清理堆棧的代碼,所以生成的可執行文件會相對較大。__cdecl可以寫成_cdecl。
__stdcall調用約定用於調用Win32API函數。采用__stdcal約定時,函數參數從右向左放入堆棧,被調用的函數在返回前清理傳遞參數的堆棧,函數參數個數固定。因為函數體本身知道傳遞參數的個數,所以被調用的函數在返回之前可以直接用retn指令清理傳遞參數的堆棧。__stdcall可以寫成_stdcall。
__fastcall約定用於對性能要求非常高的情況。__fastcall約定將函數的兩個參數從左邊開始,大小不超過4字節(DWORD)分別放在ECX和EDX寄存器中,其余參數仍在堆棧上從右向左傳輸。被調用的函數在返回之前清理被傳遞參數的堆棧。__fastcall可以寫成_fastcall。
特殊說明
1.默認情況下,采用__cdecl模式,因此可以省略。
2.WINAPI壹般用於修飾動態鏈接庫中的導出函數。
3.回調只用於修飾回調函數。
4.妳可能發現VC和BCB下WINAPI的定義是不壹樣的,所以至少妳懂了。
我們不能從BCB直接調用VC的dll的壹個原因。