2012-06-16 12 views
7

Duplicar posible:
What does a “CALLBACK” declaration in C do?¿Qué significa "CALLBACK" en una declaración de función API de Windows?

El prototipo de una función WindowProc() es la siguiente

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

pero nunca me he encontrado con la palabra clave devolución de llamada, que sólo sepa que una función de devolución de llamada es aquella a la que le pasa un puntero a otra función, entonces, ¿qué es exactamente este CALLBACK aquí? y que hace?

Respuesta

7

Está #defined como __stdcall, porque eso es lo que supone la API de Win32 sobre las funciones de devolución de llamada. Es una convención de llamadas: describe la manera en que se organiza la llamada de función en el nivel bajo, cómo están dispuestos los parámetros en la pila de la CPU y cosas por el estilo. Las suposiciones sobre el diseño esperado de la pila (es decir, la convención) deben coincidir entre la persona que llama y la persona que llama, de lo contrario podrían producirse todo tipo de consecuencias divertidas.

Históricamente, en las CPU Intel había múltiples convenciones; aún más si cuentas compiladores que no son de Microsoft. Asegurarse de que sus devoluciones de llamada sean __stdcall es una buena práctica. En algunos casos, según el compilador y la configuración, __stdcall es la convención de llamadas predeterminada (es decir, puede omitir CALLBACK de forma segura), pero no siempre.

De vuelta en Win16, CALLBACK se definió como far pascal. Es mucho menos probable que sea el predeterminado para las funciones del usuario, especialmente en un programa C. El hecho de que las devoluciones de llamada se suponía que tenían una convención de llamadas Pascal fue un artefacto histórico.

+0

¿qué es exactamente _stdcall? la forma en que LRESULT es el tipo de devolución, ¿qué es _stdclall? ¿Qué posición ocupa en la declinación? Y, podría decirlo un poco simple, ¿a qué responde? – Ghost

+0

__stdcall denota una [convención de llamadas] (http://en.wikipedia.org/wiki/Calling_convention), una de muchas posibles. Una devolución de llamada es una técnica donde API llama a su función en lugar de viceversa. Para hacerlo correctamente, la API necesita conocer la convención de llamadas que sigue su función. –

+0

¿cómo podemos cambiar la convención de llamadas? ¿Y la función winproc también sigue la convención de alguna manera (no tiene sentido, porque le estamos diciendo a Windows qué convención seguir, lo que significa que winproc está conectado a la convención)? Perdón por la variedad de preguntas, no estoy completamente satisfecho – Ghost

Cuestiones relacionadas