2012-06-16 13 views

Odpowiedz

7

Jest #defined jako __stdcall, ponieważ to właśnie zakłada API Win32 dotyczące funkcji wywołania zwrotnego. Jest to konwencja wywołująca - opisuje sposób, w jaki wywołanie funkcji jest ustawione na niskim poziomie - w jaki sposób parametry są ułożone na stosie procesora i tym podobne. Założenia dotyczące oczekiwanego układu stosu (na przykład konwencja) muszą być zgodne między dzwoniącym a kamerzystą, w przeciwnym razie mogą wystąpić wszelkiego rodzaju zabawne konsekwencje.

Historycznie, na procesorach Intela istniało wiele konwencji; jeszcze więcej, jeśli policzycie kompilatory inne niż Microsoft. Upewnienie się, że twoje wywołania zwrotne są __stdcall, jest dobrą praktyką. W niektórych przypadkach, zależnie od kompilatora i ustawień, __stdcall jest domyślną konwencją wywołania (tzn. Można bezpiecznie pominąć CALLBACK), ale nie zawsze.

Powrót w Win16, CALLBACK został zdefiniowany jako far pascal. To jeszcze mniej prawdopodobne, że będzie domyślne dla funkcji użytkownika, szczególnie w programie C. Zakłada się, że callback miał konwencję wywoływania Pascala jako historyczny artefakt.

+0

czym właściwie jest _stdcall? sposób LRESULT jest typem zwracanym, czym jest _stdclall? Jakie stanowisko zajmuje w dekloryzacji? I, możesz to powiedzieć trochę po prostu - do czego to się odwołuje? – Ghost

+0

__stdcall oznacza [konwencję wywołującą] (http://en.wikipedia.org/wiki/Calling_convention), jedną z wielu możliwych. Callback to technika, w której API wywołuje twoją funkcję zamiast na odwrót. Aby to zrobić poprawnie, API musi znać konwencję wywoływania, za którą odpowiada twoja funkcja. –

+0

jak możemy zmienić konwencję wywoływania? I czy funkcja winproc również jest jakoś zgodna z konwencją (czy to nie ma sensu, ponieważ mówimy oknom, do której konwencji należy się stosować, co oznacza, że ​​winproc jest połączony z konwencją)? Przepraszam za szereg pytań, jestem jst niezupełnie zadowolony – Ghost

Powiązane problemy