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


@Henrik

Alleine macht es ja auch keinen Spaß  ;)


@Maximilian


 Bei der 32bit-cdecl-dll:

- worm_export_tar schafft er es sogar noch 2x das callback aufzurufen und es werden 128 KB geschrieben, danach folgt eine AccessViolation

- bei den beiden filtered sieht es ca. so aus: das callback wird 5x aufgerufen mit zunächst chunkLength = 0 danach 4x chunkLength=501, dann folgt die AccessViolation. Das tar-file ist zwar nicht wirklich abgeschlossen, lässt sich aber öffnen und beinhaltet die info.csv + X509.pem.


Springe ich im Debugger über die AccessViolation drüber bekomme ich im Wiederholungsfall 0x1016 als Fehlercode (habe noch keine Definition davon gefunden).


Alle anderen Funktionen machen bei allen 3 dlls keine Probleme - zumindest jene die ich getestet habe (Start, Update Finish; Cert, Seriennummern,  Signatur, sonst. Transaktionsdaten holen).


Dies sind meine DLLImports:

        [DllImport("WormAPI.dll", CallingConvention = CallingConvention.Cdecl,  CharSet = CharSet.Ansi)]
        public static extern WormError worm_export_tar(IntPtr context, WormExportTarCallback callback, IntPtr callbackData);

        [DllImport("WormAPI.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern WormError worm_export_tar_filtered_time(IntPtr context, ulong startDate, ulong endDate, string clientId, WormExportTarCallback callback, IntPtr callbackData);

        [DllImport("WormAPI.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern WormError worm_export_tar_filtered_transaction(IntPtr context, ulong startTransaction, ulong endTransaction, string clientId, WormExportTarCallback callback, IntPtr callbackData);

        public delegate int WormExportTarCallback(IntPtr chunk, int chunkLength, IntPtr callBackData);

 

Gruß,

Jan


1 Person gefällt dies

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

@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




 @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


@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 :)

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

 

@Henrik

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

Gibt es hierzu schon etwas neues?

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

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

 

 

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

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

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?

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


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen