2012-06-16 69 views

回答

7

它被定義爲__stdcall,因爲這就是Win32 API對回調函數的假設。這是一個調用約定 - 它描述了函數調用在低層安排的方式 - 參數如何排列在CPU堆棧上,等等。關於預期堆棧佈局(即約定)的假設必須匹配調用者和被調用者之間,否則會產生各種有趣的後果。

歷史上,在Intel CPU上有多種約定;如果您計算非微軟編譯器,則更是如此。確保你的回調是__stdcall是一個好習慣。在某些情況下,取決於編譯器和設置,__stdcall是默認調用約定(即,您可以放心地忽略CALLBACK),但並非總是如此。

回到Win16,CALLBACK定義爲far pascal。這更不可能成爲用戶功能的默認設置,特別是在C程序中。回調被假定爲具有帕斯卡調用約定的事實是一個歷史人造物。

+0

_stdcall究竟是什麼? LRESULT是返回類型的方式,什麼是_stdclall?它在減速中佔據什麼位置?而且,你能否簡單地說 - 它回調到什麼程度? – Ghost

+0

__stdcall表示[調用約定](http://en.wikipedia.org/wiki/Calling_convention),其中很多可能。回調是API調用你的函數而不是反過來的技術。要做到這一點,API需要知道你的函數遵循的調用約定。 –

+0

我們如何改變呼叫約定? winproc函數是否也遵循約定(沒有意義,因爲我們告訴窗口遵循哪種約定,這意味着winproc與約定連接)?對不起,對於一系列問題,我很不滿意 – Ghost

相關問題