OK, danke.
Ich habe mal mit der Umsetzung für Linux / Delphi angefangen.
Die
DLL lädt man unter Linux per "dlopen", das funktioniert soweit auch, ich erhalte ein gültiges
handle.
Die Entsprechung von GetProcAdress ist unter Linux "dlsym", aber da habe ich ein Problem.
Unter Delphi (Windows) siehts so aus (verkürzt):
Delphi-Quellcode:
procedure AssignProc(var Proc: Pointer; ProcName: PAnsiChar);
begin
Proc := GetProcAddress(FDLLHandle, ProcName);
end;
...
AssignProc(@DebenuPDFLibraryUnlockKey, 'DPLUnlockKey');
Unter C++ findet aber wohl so eine Art Typecast statt, da sieht es so aus:
Code:
FoxitQPLUnlockKey = (FoxitQPLFuncType121)AttachFunction("DPLUnlockKey");
Die Zuweisung in der AttachFunction sieht so aus (leicht gekürzt):
Code:
void* FoxitQPLLinuxCPP1612::AttachFunction(const char* funcName, bool ignoreError)
{
void* address = dlsym(soHandle, funcName);
return address;
}
FoxItQPLFunctType ist in der .h-Datei so deklariert:
Code:
typedef int (*FoxitQPLFuncType121)(int, wchar_t*);
Was bedeutet das für die Übernahme nach Delphi? So hätte ich es mal angenommen, funktioniert aber nicht:
Proc := dlsym (FDLLHandle, ProcName); // Hier erhalte ich einen Fehler "Segmentations fault (11).
In der Klasse habe ich das so deklariert, muss das evtl. anders sein (C-Paramenter-Reihenfolge, etc?):
Delphi-Quellcode:
type
TDebenuPDFLibraryDLL1612 = class
private
FLibraryLoaded: Boolean;
FDLLHandle: Cardinal;
FInstanceID: Integer;
...
DebenuPDFLibraryUnlockKey: function(InstanceID: Integer; LicenseKey: PWideChar): Integer; stdcall;
...
end;
In der C++-Klasse ist es so definiert:
Code:
typedef int (*FoxitQPLFuncType121)(int, wchar_t*);
FoxitQPLFuncType121 FoxitQPLUnlockKey;
Jemand eine Idee, was ich hier ändern müsste?