WINAPI

視窗作業系統應用程式接口(Windows API),有非正式的簡稱法為WinAPI,是微軟對於Windows作業系統中可用的核心應用程式編程接口的稱法。它設計為由C/C++程式調用,而且它也是套用軟體與Windows系統最直接的互動方式。

含義

WINAPI見windef.h這個頭檔案

#define WINAPI__stdcall

默認情況下,我們的函式調用都是遵循__stdcall這個規則的。當然,也有諸如__cdecl、__pascal等規則。

使用__stdcall還是__cdecl或__pascal,在純Windows編程下並非特別需要。

__stdcall:

1、進行函式調用,函式參數的入棧方式是最右邊先入棧。

2、同時__stdcall規定,被調函式負責棧的回收(調用者只負責壓棧). 題外話:__pascal的調用規則是從左到右,正好與__stdcall相反。

3、C調用約定(即用__cdecl關鍵字說明)(The C default calling convention)按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於傳送參數的記憶體棧是由調用者來維護的(正因為如此,實現可變參數vararg的函式(如printf)只能使用該調用約定)當然,這些工作是應用程式自己完成的,不需要編寫者動手。彙編語言另當別論(POP SP POP BP等) 。另外,在函式名修飾約定方面也有所不同。 _cdecl是C和C++程式的預設調用方式。每一個調用它的函式都包含清空堆疊的代碼,所以產生的執行檔大小會比調用_stdcall函式的大。函式採用從右到左的壓棧方式。VC將函式編譯後會在函式名前面加上下劃線前綴。

MFC預設調用約定

在函式調用過程中,會使用棧。__stdcall與__cdecl是兩種不同的函式調用約定,定義了函式參數入棧的順序,由調用函式還是被調用函式將參數彈出棧,以及產生函式修飾名的方法。關於這兩個調用約定的詳細信息,讀者可參看MSDN。對於參數個數可變的函式,例如printf,使用的是__cdecl調用約定,Win32的API函式都遵循__stdcall調用約定。在VC++開發環境中,默認的編譯選項是__cdecl,對於那些需要__stdcall調用約定的函式,在聲明時必須顯式地加上__stdcall。在Windows程式中,回調函式必須遵循__stdcall調用約定,所以我們在聲明回調函式時要使用CALLBACK。使用CALLBACK而不是__stdcall的原因是為了告訴我們這是一個回調函式。注意,在Windows 98和Windows 2000下,聲明視窗過程函式時,即使不使用CALLBACK也不會出錯,但在Windows NT4.0下,則會出錯。

相關詞條

相關搜尋

熱門詞條

聯絡我們