Что означает «CALLBACK» в объявлении функции Windows API? [Дубликат]

Possible Duplicate:
What does a “CALLBACK” declaration in C do?

Прототип функции WindowProc () это

      LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);

но я никогда не сталкивался с ключевым словом CALLBACK, я только знаю, что функция обратного вызова - это та, на которую вы передаете указатель на другую функцию, так что же это за CALLBACK? и что это делает?

Ответы на вопрос(1)

Решение Вопроса

Это определяется как__stdcallпотому что это то, что Win32 API предполагает в отношении функций обратного вызова. Это соглашение о вызовах - оно описывает способ организации вызова функций на низком уровне - как параметры располагаются в стеке ЦП и тому подобное. Предположения относительно ожидаемой компоновки стека (то есть соглашения) должны совпадать между вызывающим и вызываемым, в противном случае могут возникнуть всевозможные забавные последствия.

Исторически на процессорах Intel было несколько соглашений; даже больше, если учесть компиляторы не Microsoft. Убедиться, что ваши обратные вызовы __stdcall - хорошая практика. В некоторых случаях, в зависимости от компилятора и настроек, __stdcall является соглашением о вызовах по умолчанию (т. Е. Вы можете безопасно пропустить CALLBACK), но не всегда.

Еще в Win16 CALLBACK был определен какfar pascal, Это даже менее вероятно по умолчанию для пользовательских функций, особенно в программе на Си. Тот факт, что обратные вызовы должны были иметь соглашение о вызовах Паскаля, был историческим артефактом.

 Ghost16 июн. 2012 г., 21:42
хорошо, спасибо, вы были очень полезны
 Ghost16 июн. 2012 г., 21:34
как мы можем изменить соглашение о вызовах? А функция winproc также каким-то образом следует соглашению (разве это не имеет смысла, потому что мы говорим Windows, какому соглашению следовать, что означает, что winproc связан с соглашением)? Извините за множество вопросов, я не полностью удовлетворен
 16 июн. 2012 г., 21:16
__stdcall обозначаетcalling conventionодин из многих возможных. Обратный вызов - это метод, при котором API вызывает вашу функцию, а не наоборот. Чтобы сделать это правильно, API должен знать соглашение о вызовах, которому следует ваша функция.
 Ghost16 июн. 2012 г., 21:14
что именно _stdcall? как LRESULT это тип возвращаемого значения, что такое _stdclall? какую позицию он занимает в объявлении? И, можно сказать, немного проще - к чему это обратный вызов?
 16 июн. 2012 г., 21:38
Вы можете изменить соглашение о вызовах в своих функциях. Посмотрите ключевые слова __cdecl, __thiscall, __fastcall. ОДНАКО, если функция будет вызываться кодом, который не является вашим (например, кодом Windows), соглашение, с которым вы ее объявляете, должно соответствовать соглашению, с которым она будет вызвана. Это __stdcall, потому что это то, что предполагает Windows. В заголовочных файлах Windows __stdcall для вашего удобства называется псевдонимом CALLBACK.

Ваш ответ на вопрос