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
Antwort Antwort
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#1

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
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 21. Jan 2019, 10:52
    Proc := dlsym (FDLLHandle, ProcName); // Hier erhalte ich einen Fehler "Segmentations fault (11).
Sicher, dass dein Handle an der Stelle korrekt ist? Und auch dass ProcName auf einen validen nullterminierten String zeigt? Anders kann ich mir den SegFault hier beim Aufruf eigentlich nicht erklären. Deine Type Definitions und der ganze Rest haben hier eigentlich noch gar keinen Einfluss auf irgendwas.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
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 21. Jan 2019, 18:32
OK, danke, der Tipp war gut. Da stimmte ein Bezug zum DLL-Namen nicht, so dass die Datei gar nicht geladen werden konnte.

Interessanterweise hatte ich das gedebugt, der Debugger zeigte mir aber einen Wert <> 0 für das Handle an (obwohl tatsächlich null).

Da scheint es ein kleines Debug-Problem unter Linux zu geben?

Wie auch immer, jetzt funktioniert es...

Was mir allerdings nicht gelingt, ist der richtige Aufruf der Unlockkey-Function, ich erhalte (trotz richtigem Key) immer Null zurück, müsste aber 1 sein.

Muss ich evtl.
DebenuPDFLibraryUnlockKey: function(InstanceID: Integer; LicenseKey: PWideChar): Integer; stdcall;

ändern in
DebenuPDFLibraryUnlockKey: function(InstanceID: Integer; LicenseKey: PWideChar): Integer; cdecl;

Oder noch was anderes (denn diese Änderung allein bringt es leider auch nicht)...
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 21. Jan 2019, 18:57
Char* auf C-Seite ist im Normalfall ein PAnsiChar in Delphi.
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#5

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 21. Jan 2019, 21:55
Nein, mit PAnsiChar komme ich leider auch nicht weiter

In C++ ist die Funktion wie folgt deklariert:

Code:
int FoxitQPLLinuxCPP1611::UnlockKey(const std::wstring& LicenseKey)
{
    if (loadError) return 0;
    return FoxitQPLUnlockKey(instanceID, WideStringParm(LicenseKey));
}
Also das sieht für mich eindeutig nach Widestring aus. In der Windows-Unit, welche den Zugriff auf die Windows-QPDF-Dll ermöglicht, geht es auch per Widechar...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.782 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 05:05
.. viellieicht hilft das: https://stackoverflow.com/questions/...g-vs-stdstring

Grüße Klaus
Klaus
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 07:39
Code:
int FoxitQPLLinuxCPP1611::UnlockKey(const std::wstring& LicenseKey)
{
    if (loadError) return 0;
    return FoxitQPLUnlockKey(instanceID, WideStringParm(LicenseKey));
}
Dann sollte Deine Deklaration allerdings korrekt sein,
wie ist die function WideStringParm deklariert?

Wo ich mir nicht sicher bin ist die calling convention, ich denke es müsste cdecl sein......
Fritz Westermann
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:32 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