Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 20. Jan 2019, 23:08
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?

Geändert von Harry Stahl (20. Jan 2019 um 23:31 Uhr)
  Mit Zitat antworten Zitat