Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Modo sfcall vs cdecl (https://www.clubdelphi.com/foros/showthread.php?t=55174)

Guillermo80 09-04-2008 21:07:55

Modo sfcall vs cdecl
 
Al grano: tengo una función que hace uso de una dll, cuya cabecera es la siguiente (menos el modo de llamada el resto no se puede modificar):

Cita:

function FLAC__stream_encoder_init_FILE
(encoder:PFLAC__StreamEncoder; pfile:PFile; progress_callback:Pointer; client_data:Pointer):FLAC__StreamEncoderInitStatus;safecall; External libFLAC;
Previo: Como podéis imaginar, internamente se hacen una serie de inicializaciones en PFLAC__StreamEncoder, y el fichero será un wav abierto en modo lectura/escritura que en esta función se limita a (tras hacer las correspondientes validaciones de que no está vacío y tal) almacenarse en un campo de un regitro.

Mi cuestión: resulta que yo empezaba antes como modo de llamada cdecl, pero en un String del enumerado que me devuelve se me advierte de que el fichero wav no es "streamable" (que no lo puede hacer en flujo), pero mi fichero es correcto y lo he revisado muchas veces de que le llega correctamente. Mi sorpresa fue grata al descubrir que usando el modo sfcall sí que me devolvía "OK". La documentación delphi dice que

Cita:

"The safecall convention implements COM error and exception handling.
The safecall convention must be used for declaring dual-interface methods
A dual interface is an interface that supports both compile-time binding and runtime binding through Automation"
No he querido traducirlo por si malinterpreto parte del texto, pero me gustaría saber, ya que no estoy seguro, si he hecho bien o por el contrario estoy enmascarando el problema de la excepción.

Mi duda viene sobre todo porque mientras antes al pasarle como prueba un puntero a fichero que sea nulo me advertía la función (con el enumerado) de que era un error lo que estaba introduciendo, pero ahora me sale "OK" y me escama un poco todo esto.

Un saludo.

Guillermo80 09-04-2008 22:22:53

Un detalle que no he incluido antes, y es que las otras llamadas a funciones me van bien, y las tengo con el modo cdecl.

Guillermo80 10-04-2008 12:30:15

Otro detalle, internamente, esa funcion hace una comparación (en VC++) del fichero wav con stdout, ¿tendía algo que ver?


La franja horaria es GMT +2. Ahora son las 11:27:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi