我们尝试将字符串从本机Delphi程序传递给Delphi Prism DLL。 传递整数没有问题,但DLL中的字符串不匹配。 我们在回答另一个问题时看到Robert Love's code snippet,但是没有本机Delphi程序的代码。
我们如何将字符串从Delphi传递给Delphi Prism DLL?
答案 0 :(得分:8)
最好的方法是使用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)传递,这可能是 NOT 您想要做的事情。
这是如何从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编译它时会遇到异常(取决于最初的开发系统)
答案 1 :(得分:1)
Delphi Win32中的字符串管理方式与.Net中的字符串不同,因此您无法将.Net字符串传递给Delphi Win32,反之亦然。
要交换字符串值,最好使用两个编译器都支持的PChar类型。这与将字符串值发送到Windows API函数的方式相同。
此致
P.S。我不是罗伯特; - )