Neues Thema starten
Beantwortet

Export von TAR-Dateien über die StdCall-DLL

Wir versuchen aktuell den TAR-Export mit der StdCall-DLL umzusetzen.

Leider scheitern wir noch daran. 


 Den DLL-Funktionsaufruf haben wir so deklariert: 

TWorm_export_tar = function(context: Pointer; callback: Pointer; callbackData: PAnsiString): Integer; stdcall;

 Die Callback-Funktion so:

 

TWormExportTarCallBack = function(const chunk: Pointer; const chunkLength: NativeUInt; const callBackData: PAnsiString): Integer; stdcall;

Der Aufruf der Export-Funktion erfolgt so: 

 

 worm_export_tar(context, @exportTarCallback, @callBackData)

 

Die Callback-Funktion wird auch aufgerufen, allerdings ist "chunkLength" immer 0 und als Chunk kriegen wir folgende Werte:

info.csv

Unixt_1573748718_Sig-1398_Log-Tra_No-14_Start_Client-15683-0001-0001-0001.log

Unixt_1573827489_Sig-1462_Log-Sys_LogOut.log


Hat jemand eine Idee woran das liegen kann bzw. was wir falsch machen?


Beste Antwort

Habe heute eine Rückmeldung erhalten, der Fehler konnte nachgestellt werden und ist in der nächsten SDK-Version behoben :)


Hallo Henrik,


ich hab die selbe Version. Kannst du mir die Deklaration der Funktionen und, wenn möglich, die Funktionen an sich hier rein stellen? Vielleicht mache ich einfach etwas falsch...


Dennis

Hallo Dennis,
hier auszugsweise unsere Lösung (abgerüstet um Initialisierung, Fehlerhandling, usw...).

 

--- Deklarationen ---

type
  PBytes = ^TBytes;
  PInteger = ^Integer;
  TOnExportBlock = function(aBlock: PBytes; aLength: DWORD; aBlock1: PBytes): Integer; stdcall;


    W_Export_Tar:
      function(aContext: IntPtr; aExportTarCallback: TOnExportBlock; aBlock1: PInteger): Integer; stdcall;
    W_Export_Filtered_Time:
      function(aContext: IntPtr; aStartDate: DWORD; aEndDate: DWORD; const aClientId: AnsiString;
               aExportTarCallback: TOnExportBlock; aBlock1: PInteger): Integer; stdcall;
    W_Export_Filtered_Transaction:
      function(aContext: IntPtr; aNumberStart: DWORD; aNumberEnd: DWORD; const aClientId: AnsiString;
               aExportTarCallback: TOnExportBlock; aBlock1: PInteger): Integer; stdcall;

--- DLL-Init ---
  // Export
  @W_Export_Tar                  := _GetProcAddress('worm_export_tar');
  @W_Export_Filtered_Time        := _GetProcAddress('worm_export_tar_filtered_time');
  @W_Export_Filtered_Transaction := _GetProcAddress('worm_export_tar_filtered_transaction');


--- Export-Callback ---
function WormExportTarCallback(aBlock: PBytes; aLength: DWORD; aUserData: PBytes): Integer; stdcall;
var
  laenge: Integer;
begin
  Result := 0;
  try
    laenge := Length(aUserData^);
    SetLength(aUserData^, laenge + Integer(aLength));
    Move(aBlock^, aUserData^[laenge], aLength);
  except
    Result := 1;
  end;
end;

--- Export-Fkt. ---


function TTSESwissbitConnection.KomplettExport(): Integer;
var
  bytes: TBytes;
begin
    SetLength(bytes, 0);
    Self.W_Export_Tar(FWormContext, WormExportTarCallback, @bytes));
    if Length(bytes) = 0 then begin
      raise Exception.Create(TTSEKonstanten.cKeineDatenFuerExport);
    end;
    { bytes speichern... }
end;

function TTSESwissbitConnection.GetArchivExport(const aKasse: string; const aNummerVon, aNummerBis: UInt32): TBytes;
begin
    SetLength(Result, 0);
    Self.W_Export_Filtered_Transaction(FWormContext,
                                       aNummerVon,
                                       nummerBis,
                                       AnsiString(aKasse),
                                       WormExportTarCallback,
                                       @Result);
end;

function TTSESwissbitConnection.GetArchivExport(const aKasse: string; const aDatumVon, aDatumBis: TDateTime): TBytes;
begin
    SetLength(Result, 0);
    Self.W_Export_Filtered_Time(FWormContext,
                                DateTimeToUnix(aDatumVon, False),
                                DateTimeToUnix(aDatumBis, False),
                                AnsiString(aKasse),
                                WormExportTarCallback,
                                @Result);
end;

Ich hoffe, es hilft

Henrik

 

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen