Bueno gente, necesito vuestro consejo. Aquí hablo del lenguaje C, pero no os asustéis porque la pregunta no va por ahí.
Tengo una librería DLL escrita en C que tiene varias funciones que utilizan o devuelven una lista (ARRAY). C utiliza punteros para estos casos, así que hice algo como:
Código Delphi
[-]PROGRAM ejemplo;
TYPE
TLISTAptr = ^TLISTA;
TLISTA = RECORD
Campo: INTEGER;
Otro: INTEGER;
END;
FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';
VAR
LaLista: TLISTAptr;
BEGIN
LaLista := obtiene_lista;
WriteLn (LaLista[0]);
END.
Esto compila y funciona perfectamente con Free Pascal, pero
me han dicho que falla en Delphi. Así que lo cambié por esto, pensando que iba a funcionar:
Código Delphi
[-]PROGRAM ejemplo;
TYPE
TLISTAOBJptr = ^TLISTA;
TLISTAOBJ = RECORD
Campo: INTEGER;
Otro: INTEGER;
END;
TLISTAptr = ^TLISTA;
TLISTA = ARRAY OF TLISTAOBJ;
FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';
VAR
LaLista: TLISTAptr;
BEGIN
LaLista := obtiene_lista;
WriteLn (LaLista^[0]);
END.
Esto compila en Free Pascal pero me da un error 216 en tiempo de ejecución.
Sin embargo, el siguiente código parece funcionar en ambos entornos:
Código Delphi
[-]PROGRAM ejemplo;
TYPE
TLISTAOBJptr = ^TLISTA;
TLISTAOBJ = RECORD
Campo: INTEGER;
Otro: INTEGER;
END;
TLISTAptr = ^TLISTA;
TLISTA = ARRAY [0..80] OF TLISTAOBJ;
FUNCTION obtiene_lista: TLISTAptr; CDECL; EXTERNAL 'libreria.dll';
VAR
LaLista: TLISTAptr;
BEGIN
LaLista := obtiene_lista;
WriteLn (LaLista^[0]);
END.
Pero esto no me interesa porque la lista puede tener tamaños muy variados y no es conveniente ponerle un tamaño predeterminado.
Lo que estoy pensando es utilizar dos definiciones distintas, una para Delphi y otra para Free Pascal. Para este último lo tengo claro, pero para Delphi no ¿Alguna idea de cómo trabajar con un puntero a una lista de tamaño variable que funcione en Delphi?
Gracias.