In navolging van mijn Fiskaly avontuur loop ik tegen iets vreemds aan.
Om, voor mij nog onbekende reden, mag ik niet zelf direct tegen de RESTful service van het bedrijf aanpraten, maar MOET ik gebruik maken van hun library (en als dat niet mogelijk is een "Service" executable).
Het is een DLL die, volgens mij, met Visual Studio in het achterhoofd is geschreven en wellicht ligt daar het probleem.
Ik kan de DLL ogenschijnlijk gewoon (explicit/dynamisch) gebruiken in Delphi (10.3.3).
Wanneer ik één van de twee exports gebruik, krijg ik netjes een antwoord terug (een string in JSON-RPC 2.0 -formaat).
Vervolgens sluit ik mijn testapplicatie af, geef de DLL weer vrij met FreeLibrary (dat gaat gewoon goed) en krijg dan een access violation in de destructor van TApplication op onderstaande regel:
Delphi Code:
// Knip uit destructor TApplication.Destroy - BEGIN
if TOSVersion.Check(5, 1) then
WTSUnRegisterSessionNotification(FHandle); // <==== AV
// Knip uit destructor TApplication.Destroy - END
Ik kan het probleem helemaal terugvoeren tot aan een schone eenvoudige test-applicatie met maar één form en dit in de implementation:
Delphi Code:
const
// DLL can be found at: [url]https://developer.fiskaly.com/downloads/[/url] under "Library / Windows / 386"
DLLName = 'com.fiskaly.client-windows-386-v1.2.100.dll';
var
_DLLHandle: HMODULE = 0;
initialization
_DLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + DLLName));
finalization
if _DLLHandle >= 32 then
FreeLibrary(_DLLHandle)
end.
Als ik FreeLibrary niet aanroep, dan doet de AV zich niet voor (maar dan geef ik de DLL handle natuurlijk ook niet vrij).
Het "Leuke" is zelfs, dat als ik alles uitzet in de DPR, het probleem zich nog steeds voordoet:
Delphi Code:
begin
// Application.Initialize;
// Application.MainFormOnTaskbar := True;
// Application.CreateForm(TForm1, Form1);
// Application.Run;
end.
Kijk ik ergens overheen? Is Delphi gewoon niet compatible met deze DLL? Moet ik LoadLibraryEx (oid) gebruiken?
Mocht je het uit willen proberen: de test applicatie staat hieronder en de DLL moet je zelf even downloaden (is te groot voor het forum)
Alvast bedankt voor jullie expertise.
Bookmarks