Completando un poco lo comentado en la entrada anterior, me ha pedido un compañero a traves de un correo, que ampliara la información sobre los convenios de llamada en procedimientos y funciones. No entendia muy bien que era eso de «stdcall» o «cdecl»
Si seguisteis los pasos que dimos, al llegar al punto de ir detallando las funciones que exportaba la librería en Velneo, nos encontrabamos con dos opciones a elegir, que estaban directamente relacionadas con la directiva que habia sido aplicada a cada una de las funciones de la dll. Segun la directiva aplicada en la función, se determinará el orden en que se pasan los parámetros de los procedimientos y funciones, el modo en el que serán pasados (en algun tipo de convención como la aplicada por la directiva register los parametros son pasados a los registros de la CPU) y el responsable de la eliminación de los mismos en la pila. En nuestro caso, aplicado al ejemplo actual cambio solo esto último.
Lo mejor es verlo en una tabla para las dos directivas que podemos aplicar:
DIRECTIVA | ORDEN DE LOS PARAMETROS | RESPONSBLE LIMPIEZA MEMORIA | PARAMETROS A REGISTROS |
---|---|---|---|
cdecl | De Derecha a Izquierda | Quien realiza la llamada. | No |
stdcall | De Derecha a Izquierda | Rutina | No |
Así que es muy importante que tanto la librería como la importación de la misma desde Velneo marquen correctamente el convenio de llamada utilizado en cada una de las funciones.
En una buena parte de las directivas (exceptuando cdecl) son los procedimientos y funciones, los que eliminan los parametros de pila al devolver el control. En la convención cdecl es al contrario. El responsable de la invocación del procedimiento o de la función sera también responsable de eliminar los parametros de la pila en el momento en el que devuelve esa llamada. Habitualmente el convenio cdecl es utilizado en librerias que se han creado desde C o C++.
Otro comentario que olvidaba… 🙂
Respecto al tipo LPSTR, como retorno de la función, comentar que es un puntero a cadena de caracteres (pchar), equivalente al tipo PAnsiChar de Object Pascal. Lo mejor en estos casos, si se tiene duda es consultar (buscar) la traducción que se ha hecho en Delphi de los mismos (se importaron de las cabeceras originales de C propia del Api de Windows). En las primeras páginas del «Nucleo del Api de Win32» de la colección de Tomos de Delphi, viene indicada una lista de equivalencia de tipos entre Windows y Object Pascal que puede orientaros. Este libro podrá ser descargado gratuitamente desde el Rinconcito de Delphi gracias a la colaboración de DanySoft en próximas ediciones del Boletín de Delphi.
Un saludo y buen fin de semana para todos.
Comentarios recientes