PDA

Ver la Versión Completa : Pregunta teórica sobre el tipo Record en DLLs en Delphi 7


nlsgarcia
01-03-2007, 08:29:35
:) Hola:

¿Hay alguna restricción teórica en el orden de los parámetros en una estructura tipo record definida por referencia cuando esta es utilizada en un DLL escrito en Delphi para devolver valores a un programa en VB6 o cualquier otro lenguaje?

Ejemplo:

Esta estructura definida en un Dll escrito en Delphi devuelve correctamente
los datos que solicita un programa escrito en VB6


TQueryPrnStatus = Record
UltSecX : Array[0..2] of Char;
NTickets : Array[0..12] of Char;
PrnStatusHdw : Array[0..2] of Char;
ErrStatus : Array[0..2] of Char;
PaperStatus : Array[0..2] of Char;
SlipStatus : Array[0..2] of Char;
PrnID : Array[0..10] of Char;
TCounter : Array[0..6] of Char;
IvaA : Double;
IvaB : Double;
IvaC : Double;
PrnStatusApp : Byte;
LineCounter : Byte;
AutStatus : Byte;
end;


Si los campos tipo byte se colocan delante de los tipo double, la función del Dll en Delphi no da ningún error, pero los valores double son devueltos en 0. Ademas de esto si se hace un Debug al Dll, el valor del IvaC que deberia venir en 0 (Todos los campos son inicializados antes de la llamada al Dll según su tipo) viene con un valor arbitrario expresado en notación científica.


TQueryPrnStatus = Record
UltSecX : Array[0..2] of Char;
NTickets : Array[0..12] of Char;
PrnStatusHdw : Array[0..2] of Char;
ErrStatus : Array[0..2] of Char;
PaperStatus : Array[0..2] of Char;
SlipStatus : Array[0..2] of Char;
PrnID : Array[0..10] of Char;
TCounter : Array[0..6] of Char;
PrnStatusApp : Byte;
LineCounter : Byte;
AutStatus : Byte;
IvaA : Double;
IvaB : Double;
IvaC : Double;
end;


¿Hay alguna razón teórica para este comportamiento?

No incluyo el programa dado que es muy extenso, la pregunta es solo a nivel teórico y repito: El programa con la primera estructura funciona sin errores y los datos ingresan al Dll con sus respectivos valores dados en la inicialización del programa hecho en VB6.

Gracias de antemano. :)

jam
01-03-2007, 09:38:10
Prueba con TQueryPrnStatus = packed Record

nlsgarcia
02-03-2007, 03:05:41
:) Hola:

Gracias por tu comentario, voy a probar. :)