AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL in Delphi unter Linux verwenden

Ein Thema von Harry Stahl · begonnen am 20. Jan 2019 · letzter Beitrag vom 22. Jan 2019
 
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz