Ver Mensaje Individual
  #3  
Antiguo 27-07-2012
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Reputación: 16
LoPiTaL Va por buen camino
Hola!
Se me ocurren dos posibles motivos:

El primero: que en la dll declaras la función como 'cdecl' mientras que en la unit donde la usas la declaras como stdcall. O una o la otra, pero las dos no puede ser.

El segundo: no es conveniente al usar dll's crear cosas en un sitio y destruirlas en otro (siendo un sitio la dll y otro el programa, o viceversa). ¿Cómo aplica esto a tu caso? Pues aunque no lo hagas explícitamente, las strings también se crean y se destruyen. Las que pasas como parámetros las crea y las destruye el que llama y las que se devuelven como Result las crea el llamado y las destruye el que llama. Esto es malo y suele dar error. Se soluciona utilizando punteros en lugar de strings (PAnsiChar y PChar). Para los parámetros es trivial, mientras que para el resultado debes modificar la función para que devuelva boolean o integer (así sabes si ha funcionado bien o no, en caso de que lo necesites) y el result debes devolverlo en un parámetro extra también PAnsiChar (un buffer por lo general) (NO hay que declararlo como var). Se suele pasar un segundo parámetro extra para indicar el tamaño de éste buffer para que la función pueda cortar la cadena y evitar que escriba de más y se salga del buffer.

P. ej.:

Código Delphi [-]
function DGetConsumos(usuario, clave, FechaInicial, Fechafinal: PAnsiChar; Buffer: PAnsiChar; BufferSize: integer): boolean; cdecl; export;

Y su uso:

Código Delphi [-]
const
  MiDLLName='DLLCGI.dll';

function DCheckUsuario(usuario, clave, tipo: AnsiString): AnsiString; cdecl external MiDLLName name 'DCheckUsuario';
procedure TForm3.ButtonCheckUsuarioClick(Sender: TObject);
var
  LBuffer: array [0..29] of AnsiChar;
begin
try
  DCheckUsuario(PAnsiChar(EditUsuario.Text), PAnsiChar(EditClave.Text), PAnsiChar(EditTipo.Text), @LBuffer[0], 30);
  Memo2.Lines.Text := StrPas(@LBuffer[0]);
except
end;
end;

El código está escrito en el navegador, así que es posible que contenga errores, pero creo que es bastante clarificador.

Un saludo,
LoPiTaL

Última edición por LoPiTaL fecha: 27-07-2012 a las 14:01:05.
Responder Con Cita