情景一:先看下Windows開發下的使用:
這裡就有一個CALLBACK,轉到定義看一下
從上面也可以看到在windows平台下WINAPI和CALLBCAK其實是一緻的;
情景二:另外我們知道在使用dumpbin DLL符号名的時候,假設有個add函數,輸出時會如?add@@YANHH@Z之類的,如果加上extern ”C“之類的字元,輸出的函數符号就是之前定義的add函數名了,這裡就牽涉到函數調用問題,因為不同的語言和編譯器平台,約定不一樣,比如說函數的形參,預設采用的是壓入棧中,有些是從左往右壓入,有些則是從右往左壓入的,不同的标準是不一樣,是以如果調用就會出現出錯,必須要指明哪一種調用方式,以便編譯器能夠正确識别。
那麼他們有什麼差別呢?
1)首先說下,C調用标準采用的是__cdecl,采用的入棧順序,。。。
而Delphi采用的是pascal調用标準,即标準約定stdcall,也是Windows預設使用的約定,也就是說在Windows平台下WINAPI、CALLBCAK、stdcall其實都是一緻的
2)__stdcall與__cdecl是兩種不同的調用約定,定義了函數參數入棧的順序,由調用函數還是被調用函數将參數彈出棧,以及産生函數修飾名的方法
3)在Windows程式中,回調函數必須遵從__stdcall調用約定,是以使用的是CALLBACK,當然也可以直接使用__stdcall,主要是便于區分
注意:有關入棧順序,記得前面在看嵌入式方面的書籍中有關壓入棧的順序講解較多,主要他們使用彙編,必須将具體的參數壓入有關寄存器,然後取指的時候可以一一對應,回頭查找一下,再做深入的解釋