我们尝试将字符串从原生 Delphi 程序传递到 Delphi Prism DLL。传递整数没有问题,但 DLL 中的字符串不匹配。我们在回答另一个问题时看到了Robert Love 的代码片段,但是没有原生 Delphi 程序的代码。
我们如何将字符串从 Delphi 传递到 Delphi Prism DLL?
我们尝试将字符串从原生 Delphi 程序传递到 Delphi Prism DLL。传递整数没有问题,但 DLL 中的字符串不匹配。我们在回答另一个问题时看到了Robert Love 的代码片段,但是没有原生 Delphi 程序的代码。
我们如何将字符串从 Delphi 传递到 Delphi Prism DLL?
最好的方法是使用 WideString。
有几个原因。
在 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 编译时会遇到异常(取决于原始开发系统是什么)
Delphi Win32 中的字符串的管理方式与 .Net 中的字符串不同,因此您不能将 .Net 字符串传递给 Delphi Win32,反之亦然。
要交换字符串值,您最好使用两个编译器都支持的 PChar 类型。这与将字符串值发送到 Windows API 函数的方式相同。
问候
PS我不是罗伯特;-)