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
Fritzew

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

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
 
#2

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.780 Beiträge
 
Delphi 10.4 Sydney
 
#3

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
 
#4

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
Klaus01

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

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 07:46
.. kommt es nicht zu Problemen weil wchar_t unter Linux 4 Byte groß ist.
wstring basiert auf wchar_t.
Delphi hat meines Wissens keinen (String)character type der 4 Byte groß ist.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Fritzew

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

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 08:43
Ich denke da hat Klaus recht,
Benutze zum trappen der wchar_t Parameter die MarshaledAString typen. Genau so wie es Embarcadero letztendlich in der runtime macht,
scheu einfach in die source.......
Ich mache nichts mit Delphi Linux deshalb, weiss ich da auch nicht mehr aber denke die Source der Runtime sollte helfen
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
 
#7

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 17:46
In C++ ist WideStringParam so deklariert:

Code:
wchar_t* WideStringParm(const std::wstring& strParm)
{
    wchar_t* sp;
    int length = (int)strParm.length();
    if (length == 0)
    {
        sp = NULL;
    }
    else
    {
        wchar_t wordArray[length];
        for (int charX = 0; charX < length; charX++)
        {
            wordArray[charX] = (wchar_t)(strParm[charX]);
        }
        sp = (wchar_t*)FoxitQPLCreateBuffer(instanceID, length * 4);
        FoxitQPLAddToBuffer(instanceID, (char*)sp, (char*)wordArray, length * 4);
    }
    return sp;
}
In der Unit für den Zugriff auf die Windows-Version-DLL ist es so deklariert:

Delphi-Quellcode:
function StringParm(const ParmValue: WideString; var HasNulls: Boolean): PWideChar;
var
  P: Integer;
begin
  HasNulls := False;

  if ParmValue = 'then begin
    Result := nil;
  end else begin
    HasNulls := True;
    P := Length(ParmValue);
    Result := PWideChar(DebenuPDFLibraryCreateBuffer(FInstanceID, P * 2));
    DebenuPDFLibraryAddToBuffer(FInstanceID, Pointer(Result), @ParmValue[1], P * 2);
  end;
end;
Hier fällt natürlich in der Tat auf, dass der Buffer P * 2 ist, in der C++-Variante für die Linux-Version P * 4;

@FritzeW: Kann denn MarshaledA wirklich richtig sein, das ist doch letztlich nur ein Pointer auf Ansistring?

Geändert von Harry Stahl (22. Jan 2019 um 18:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 17:53
.. kommt es nicht zu Problemen weil wchar_t unter Linux 4 Byte groß ist.
wstring basiert auf wchar_t.
Delphi hat meines Wissens keinen (String)character type der 4 Byte groß ist.

Grüße
Klaus
Was würde denn daraus folgen, was könnte ich als Ersatz nehmen?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 19:32
OK, das mit dem Hinweis des 4-Byte Char-Typs unter Linux war der richtige Tipp:

Wenn ich die Strings derart manipuliere, dass jeweils nach einem Char ein #0 folgt, kann ich die Aufrufe, wo Strings übergeben müssen, tätigen und es funktioniert.

stdcall war übrigens doch richtig.

Gibt es dafür vielleicht schon eine fertige Systemfunktion (für die oben beschriebene Manipulation der Strings)?

Geändert von Harry Stahl (22. Jan 2019 um 19:34 Uhr)
  Mit Zitat antworten Zitat
Klaus01

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

AW: C++ DLL in Delphi unter Linux verwenden

  Alt 22. Jan 2019, 19:47
Zitat:
Was würde denn daraus folgen, was könnte ich als Ersatz nehmen?
Ich weiß nicht ob es funktionieren wird das ganze auf ein Array of Integer abzubilden,
eventuell auch mit varianten Records.

Oder mal bei Embacadero nachfragen wann Delphi (!=C++) char32_t unterstützen wird.

Auf eine ältere .so Datei (vor c++ 11) kannst Du nicht zugreifen -oder?
Da sollte wchar_t noch 16 Bit haben.

Grüße
Klaus
Klaus

Geändert von Klaus01 (22. Jan 2019 um 20:16 Uhr)
  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 05:25 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