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!


Wir haben das folgendermaßen umgesetzt:


Funktionsköpfe:

 

WormExportTarCallback = function(chunk: PByte; chunkLength: Cardinal; callbackData: Pointer): Integer; stdcall;

function worm_export_tar(context: PWormContext; callback: WormExportTarCallback; callbackData: Pointer): WormError; stdcall;

 Den Aufruf habe ich im folgenden Code dargelegt. Bitte nicht erschrecken, dass ist noch sehr sehr quick und dirty aber es klappt :)


  

var
callbackData : pointer;
cb : WormExportTarCallback;

function  myWormExportTarCallback (chunk: PByte; chunkLength: Cardinal;
       callbackData: Pointer): Integer; stdcall ;
var
bytes : array [0..66000] of byte;
n : integer;
aExport : string;
begin
inc(ftse_dialog.iChunks);
  ftse_dialog.mExport.Lines.Add(IntToStr(ftse_dialog.iChunks)+' Lnge '+IntToStr(chunkLength));
     for n:= 0 to (chunkLength)-1
     do begin
       bytes[n] := chunk[n];
       if bytes[n] > 32  then
         aExport := aExport +  chr(bytes[n])
       else
         aExport := aExport + '#'+IntToStr(bytes[n]);
     end;
  ftse_dialog.mExport.Lines.Add(aExport);
  result := 0;
end;

procedure TfTSE_Dialog.BitBtn5Click(Sender: TObject);


begin
GetMem(callbackData, 65000);
iChunks := 0;
cb := myWormExportTarCallback;
worm_export_tar( WormAccess.pcontext ,cb ,callbackData);
lExportStatus.Caption := 'fertig';
end; 

  

Bei Fragen gerne melden!


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen