gpt4 book ai didi

delphi - FPC与Delphi之间的字符串

转载 作者:行者123 更新时间:2023-12-01 16:29:53 24 4
gpt4 key购买 nike

我在 Delphi 中从 FPC DLL 获取String 的长度时遇到问题。这很奇怪,因为我可以从 DLL 中获取 String,但无法获取它的长度。

德尔福:

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.

软板:

library project1;

{$mode ObjFPC}{$H+}

uses
Classes;

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

exports Test;

end.

最佳答案

String 在 Delphi 2009+ 中是 UnicodeString,在早期版本中是 AnsiString

FPC 中的

String 始终为 AnsiString,它从不映射到 UnicodeString。而且 AFAIK,FPC 的字符串类型无论如何都不与 Delphi 的字符串类型二进制兼容。因此,您不能将 Delphi AnsiString 传递给 FPC AnsiString,反之亦然,对于 UnicodeString 也是如此。

无论如何,您都不应该在 DLL 边界上传递 String 值,特别是当涉及多个编译器时,尤其是因为您没有使用 FPC 的 Delphi 模式。您需要重新设计您的 DLL 以使其更加可移植,例如:

软板:

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.

德尔福:

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.

关于delphi - FPC与Delphi之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22024933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com