PDA

Ver la Versión Completa : Llamar función desde una DLL en Delphi


freynoso
30-10-2017, 16:38:54
Hola a todos, un saludo afectuoso.

Tengo una situación que me tiene bastante confundido. Al llamar una función de una DLL desde Delphi la misma me retorna resultados diferentes dependiendo de como paso los parámetros. Les comento, si paso los parámetros escritos (ej. una fecha haciendo el cast a tipo PAnsiChar('20072017'), como lo pide la librería) funciona perfectamente. Sin embargo si utilizo variables del mismo tipo de datos no me funciona.

Este es el procedimiento que ejecuto:

function TfrmMain.LibroDiario(Desde, Hasta: TDateTime; nArchivoSalida, fExtension: string): Boolean;
var Lib : THandle;
LeerLibroDiario: function(ZNro_Fecha:PAnsiChar;NombreArchivoSalida:PAnsiChar;Extension:PAnsiChar):Boolean; stdcall;
verificarConexion: function(puertoConexion:string):Boolean; stdcall;
Leido:Boolean;
Fecha: TDatetime;
sFecha, sArchivo: string;
begin
Result:=False;
begin
Lib:=LoadLibrary('TaurusInterface.dll');
verificarConexion := GetProcAddress(Lib,'verificarConexion');
if Assigned(verificarConexion) then
begin
if verificarConexion('3') then
begin
LeerLibroDiario := GetProcAddress(Lib, 'LeerLibroDiario');
if Assigned(LeerLibroDiario) then
begin
try
try
Fecha := Desde;
while Fecha <= Hasta do
begin
sFecha := FormatDateTime('ddmmyyyy', Fecha);
sArchivo := Concat('c:\lventas\LV', FormatDateTime('yymmdd', Fecha),'.001');
showmessage(Concat(sFecha, ' - ', sArchivo));
Leido:=LeerLibroDiario(PAnsiChar(sFecha), PAnsiChar(sArchivo), PAnsiChar('001')); <- Con estos parámetros NO Funciona
//PAnsiChar('20072017'), PAnsiChar('c:\lventas\LV170720.001'), PAnsiChar('001')); <- Con estos parámetros funciona
Fecha:=IncDay(Fecha,1);
Application.ProcessMessages;
end;
except on E: Exception do
raise Exception.Create('Error al extraer Libro de Venta Diario: ' + E.Message) ;
end;
finally
FreeLibrary(Lib);
Result := Leido;
end;
end;
end;
end;
end;
end;

Espero que puedan ayudarme.

Muy agradecido de antemano.

Fabio

ElKurgan
31-10-2017, 07:00:43
¿Has probado a definir "sFecha" y "sArchivo" como AnsiString?

Piensa que en las versiones Delphi a partir de Delphi 2009 llevan soporte completo Unicode, y lo que antes eran String normales ahora equivalen a WideString. Los Strings "a la antigua" son ahora AnsiSTring, y a lo mejor el Casting de String a PAnsiChar da un resultado distinto al esperado

Prueba y nos comentas como ha ido

Saludos

freynoso
31-10-2017, 14:59:09
ElKurgan, hermano, me funcionó a la perfección!!! :) Estoy muuuuuy agradecido de tu ayuda. Sabía que aquí encontraría la respuesta.