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 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

 

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,
Entschuldigung für die späte Rückmeldung. Wir müssen immer per Email um eine neue Version betteln. Deshalb dauert's immer etwas.
Bei uns funktioniert die V. 5.3 (vom 12.12.2019) mit stdcall.

version.txt im Hauptverzeichnis:

Build number: 1
Build ID: v5.3-g6a599c6


MfG Henrik


Hallo,

 

ich habe heute die neue SDK-Version ausprobiert (Version 5.3).

Auch in dieser Version ist es mir nicht möglich einen gefilterten Export zu machen, weder über die Transaktionsnummern noch über die Zeit. Als Fehler kommt einfach nur "WORM_ERROR_EXPORT_FAILED " zurück.

Habt ihr vielleicht mehr Erfolg?

Sollte nicht allzu lange dauern, habe die SDK heute weitergegeben, sollte also noch diese Woche zum Download bereitstehen. Es ist die Version 5.3.7

 

Wann wird die nächste SDK-Version denn verfügbar sein?
___________________________________________________________________________________
Maximilian Grießer gesagt vor 6 Tagen

 

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

@Maximilian
Das ist ja super. Auch ein großes Dankeschön dafür, daß Du Dich gekümmert hast und so hartnäckig geblieben bist.
Wir waren schon drauf und dran, alles auf cdecl umzustellen.
MfG Henrik

 

Antwort

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


2 Personen gefällt dies

@Dennis,


habe soeben nochmals nachgefragt. Auf eine andere Frage habe ich relativ schnell eine Antwort bekommen, in diesem Fall scheint es aber ignoriert zu werden. Wenn ich eine Antwort bekomme, poste ich es hier.

Gibt es hierzu schon etwas neues?

@Henrik

Leider noch nicht, habe aber soeben nachgefragt. Manchmal muss man ein bisschen nervig sein um Antworten zu bekommen :)

@Maximilian
Gibt's schon was neues von deinem Swissbit-Kontakt bzgl. des C-Demos/Fehlers?
MfG Henrik

 

@Henrik


Deswegen funktionierte auch der tar_export in der stdcall-Dll nicht (also vor Version 5.2.3). Da ergibt dann auch alles mehr Sinn :)

 @Max:

------------

@Jan 

Sie dir mal die Code-Samples an. Ich habe das heute erweitert, der FunctionPointer muss auch als cdelc deklariert sein. Einfach "[UnmanagedFunctionPointer(CallingConvention.Cdecl)]" drüberpacken, dann sollte der standard-export funktionieren.

------------

Genau das ist komisch. In der Header-Datei der 5.2.3. ist nämlich die einzige Änderung die Umstellung der Aufrufkonvention auf WORMAPI_CALL:

typedef int(WORMAPI_CALL *WormExportTarCallback)(...)


D. h., die Callback-Fkt. hat die gleiche Aufrufkonvention wie die übrigen Fkt. Vorher fehlte die Angabe und damit müßte es dann _immer_ cdecl gewesen sein.


MfG Henrik


@Maximilian

yep, das war es - jetzt gehen alle drei Funktionen mit cdecl auch.

Damit kann ich bestätigen dass x64 und x86cdecl einwandfrei funktionieren, stdcall ist mir zumindest jetzt nicht gar so wichtig.


Vielen Dank.


Fehler 0x1016 ist übrigens WORM_ERROR_NOT_ALLOWED_EXPORT_IN_PROGRESS - was ja auch in meinem Fall gestimmt hat.


Beste Grüße


Jan




Anmelden oder Registrieren um einen Kommentar zu veröffentlichen