2012-06-16 2 views
7

Можно создать дубликат:
What does a “CALLBACK” declaration in C do?Что означает «CALLBACK» в объявлении функции Windows API?

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

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

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

ответ

7

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

Исторически, на процессорах Intel было несколько соглашений; даже если вы считаете компиляторы, отличные от Microsoft. Убедитесь, что ваши обратные вызовы __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 также каким-то образом согласуется с соглашением (разве это не имеет смысла, потому что мы говорим о Windows, которое следует соблюдать, а это означает, что winproc связан с соглашением)? Извините за массив вопросов, я не полностью удовлетворен – Ghost

Смежные вопросы