標籤:dll callback winapi stdcall cdecl
情景一:先看下Windows開發下的使用:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
這裡就有一個CALLBACK,轉到定義看一下
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define CALLBACK __stdcall#define WINAPI __stdcall...
從上面也可以看到在windows平台下WINAPI和CALLBCAK其實是一致的;
情景二:另外我們知道在使用dumpbin DLL符號名的時候,假設有個add函數,輸出時會如[email protected]@[email protected]之類的,如果加上extern ”C“之類的字元,輸出的函數符號就是之前定義的add函數名了,這裡就牽涉到函數調用問題,因為不同的語言和編譯器平台,約定不一樣,比如說函數的形參,預設採用的是壓入棧中,有些是從左往右壓入,有些則是從右往左壓入的,不同的標準是不一樣,所以如果調用就會出現出錯,必須要指明哪一種調用方式,以便編譯器能夠正確識別。
那麼他們有什麼區別呢?
1)首先說下,C調用標準採用的是__cdecl,採用的入棧順序,。。。
而Delphi採用的是pascal調用標準,即標準約定stdcall,也是Windows預設使用的約定,也就是說在Windows平台下WINAPI、CALLBCAK、stdcall其實都是一致的
2)__stdcall與__cdecl是兩種不同的呼叫慣例,定義了函數參數入棧的順序,由調用函數還是被調用函數將參數彈出棧,以及產生函數修飾名的方法
3)在Windows程式中,回呼函數必須遵從__stdcall呼叫慣例,所以使用的是CALLBACK,當然也可以直接使用__stdcall,主要是便於區分
注意:有關入棧順序,記得前面在看嵌入式方面的書籍中有關壓入棧的順序講解較多,主要他們使用彙編,必須將具體的參數壓入有關寄存器,然後取指的時候可以一一對應,回頭尋找一下,再做深入的解釋