5

我们尝试将字符串从原生 Delphi 程序传递到 Delphi Prism DLL。传递整数没有问题,但 DLL 中的字符串不匹配。我们在回答另一个问题时看到了Robert Love 的代码片段,但是没有原生 Delphi 程序的代码。

我们如何将字符串从 Delphi 传递到 Delphi Prism DLL?

4

2 回答 2

8

最好的方法是使用 WideString。

有几个原因。

  • 它是 Unicode 并且在 D2009 之前工作
  • 它的内存在 ole32.dll 中管理,因此不依赖于 Delphi 的内存管理器或 CLR GC。
  • 您不必直接处理指针

在 Oxygene 中,你可以这样写:

type
  Sample = static class
  private
    [UnmanagedExport]
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String;
                      [MarshalAs(UnmanagedType.BStr)]out output : String);
  end;

implementation

method Sample.StringTest(input : String; out output : String);
begin
  output := input + "ä ~ î 暗";
end;

“MarshalAs”告诉 CLR 如何来回编组字符串。没有它,字符串将作为 Ansi (PAnsiChar) 传递,这可能不是您想要做的。

这是从 Delphi 中使用它的方法:

procedure StringTest(const input : WideString; out output : WideString);
  stdcall; external 'OxygeneLib';

var
  input, output : WideString;
begin
  input := 'A b c';
  StringTest(input, output);
  Writeln(output);
end.

此外,永远不要将未明确定义的类型用于外部接口。不得将 PChar 用于 DLL 导入或导出。因为如果这样做,在使用 D7 或 D2009 编译时会遇到异常(取决于原始开发系统是什么)

于 2010-02-16T18:32:14.207 回答
1

Delphi Win32 中的字符串的管理方式与 .Net 中的字符串不同,因此您不能将 .Net 字符串传递给 Delphi Win32,反之亦然。

要交换字符串值,您最好使用两个编译器都支持的 PChar 类型。这与将字符串值发送到 Windows API 函数的方式相同。

问候

PS我不是罗伯特;-)

于 2010-02-16T14:31:53.423 回答