Ver Mensaje Individual
  #1  
Antiguo 09-04-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Reputación: 18
Guillermo80 Va por buen camino
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.
Responder Con Cita