Frage

Ich habe Probleme, die Länge zu erreichen String in Delphi aus einer FPC-DLL.Was seltsam ist, weil ich das bekommen kann String von der DLL zurück, aber ich kann ihre Länge nicht ermitteln.

Delphi:

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

function Test(const S: String): Integer; cdecl; external 'c:\Project1.dll';

var
    A: String;
begin 
    A := 'test';
    WriteLn(Test(A)); // 1 ?
    ReadLn;
end.

FPC:

library project1;

{$mode ObjFPC}{$H+}

uses
  Classes;

function Test(const A: String): Integer; cdecl; export;
begin
 Result := Length(A);
end;

exports Test;

end.
War es hilfreich?

Lösung

String in Delphi 2009+ ist UnicodeString, Und AnsiString in früheren Versionen.

String in FPC ist immer AnsiString, es wird nie zugeordnet UnicodeString.Und AFAIK, die String-Typen von FPC sind ohnehin nicht binärkompatibel mit den String-Typen von Delphi.Sie können also kein Delphi bestehen AnsiString zu einem FPC AnsiString und umgekehrt, und das Gleiche gilt für UnicodeString.

Du solltest nicht vorbeikommen String Werte überschreiten ohnehin die DLL-Grenze, insbesondere wenn mehrere Compiler beteiligt sind und insbesondere, da Sie keine FPCs verwenden Delphi Modus.Sie müssen Ihre DLL neu gestalten, um sie portabler zu machen, z. B.:

FPC:

library project1;

{$mode ObjFPC}
{$H+}

uses
  Classes;

function TestA(const A: PAnsiChar): Integer; cdecl; export;
begin
 Result := Length(A);
end;

function TestW(const A: PWideChar): Integer; cdecl; export;
begin
 Result := Length(A);
end;

exports TestA, TestW;

end.

Delphi:

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

function Test(const S: PChar): Integer; cdecl; external 'Project1.dll' name {$IFDEF UNICODE}'TestW'{$ELSE}'TestA'{$ENDIF};

var
  A: String;
begin 
  A := 'test';
  WriteLn(Test(PChar(A)));
  ReadLn;
end.

Andere Tipps

Sie können es nicht verwenden string über diese Modulgrenze hinweg.Der Delphi-Typ unterscheidet sich einfach vom FPC-Typ.Es ist wahr, dass sie den gleichen Namen haben, aber das bedeutet nicht, dass sie vom gleichen Typ sind.

Selbst wenn beide Module mit demselben Compiler kompiliert würden, wären sie von unterschiedlichen Typen, würden von unterschiedlichen Heaps zugewiesen und wären für Interop nicht gültig.In Delphi könnten Sie verwenden Sharemem und die exakt gleiche Compiler-Version, aber das ist ziemlich einschränkend.

Verwenden Sie einen interopfreundlichen Typ, z PWideChar für UTF-16 oder PAnsiChar für UTF-8.Auf diese Weise ist Ihre Bibliothek nicht eingeschränkt und kann mit allem interagieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top