Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C++ DLL in Delphi unter Linux verwenden (https://www.delphipraxis.net/199398-c-dll-delphi-unter-linux-verwenden.html)

Fritzew 22. Jan 2019 08:43

AW: C++ DLL in Delphi unter Linux verwenden
 
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

Harry Stahl 22. Jan 2019 17:46

AW: C++ DLL in Delphi unter Linux verwenden
 
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?

Harry Stahl 22. Jan 2019 17:53

AW: C++ DLL in Delphi unter Linux verwenden
 
Zitat:

Zitat von Klaus01 (Beitrag 1423796)
.. 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?

Harry Stahl 22. Jan 2019 19:32

AW: C++ DLL in Delphi unter Linux verwenden
 
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)?

Klaus01 22. Jan 2019 19:47

AW: C++ DLL in Delphi unter Linux verwenden
 
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

Harry Stahl 22. Jan 2019 21:20

AW: C++ DLL in Delphi unter Linux verwenden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe jetzt einfach eine einfache Funktion ("StringTo4") geschrieben, welche einen String wie im vorherigen Beitrag beschrieben umwandelt und immer wenn die DLL mit Stringwerten angesprochen werden soll, wird der über diesen Aufruf der Funktion übergeben.

Das funktioniert soweit ganz gut, ich kann die QPDF-Library öffnen, Informationen auslesen, etc. Nur wenn ich Strings zurück erhalte, da muss ich noch was anpassen (eben im umgekehrten Sinne), da sonst wegen der #0 Zeichen immer nur ein Zeichen zurückgeliefert wird (z.B. beim Auslesen des Inhaltsverzeichnisses aus der PDF-Datei).

Anliegend mal ein Screenshot, der belegt, dass ich nun mit der Quick-PDF-Library unter Linux eine PDF-Datei mit meinem PDF-Manager-Programm einlesen und anzeigen kann (Nachtrag: Auslesen des IV funktioniert auch schon, siehe Screenshot 2).

Ich werde das Programm kurzerhand für Linux fertig stellen und wenn ich das erledigt habe, werde ich einen kurzen Blog-Beitrag erstellen, wo ich genau beschreiben werde, was man machen muss, damit man als Delphi-Anwender diese .so-Library auch mit Delphi unter Linux verwenden kann.

Danke schon mal für alle Hilfestellungen hier.:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz