Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamar función desde una DLL en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=92441)

freynoso 30-10-2017 16:38:54

Llamar función desde una DLL en Delphi
 
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:
Código Delphi [-]
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

Llamar función desde una DLL en Delphi
 
ElKurgan, hermano, me funcionó a la perfección!!! :) Estoy muuuuuy agradecido de tu ayuda. Sabía que aquí encontraría la respuesta.


La franja horaria es GMT +2. Ahora son las 23:55:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi