我们尝试从原生Delphi程序传递一个字符串到Delphi Prism DLL。 传递整数没有问题,但字符串在DLL中不匹配。 我们在回答另一个问题时看到了Robert Love's code snippet,但是没有原生Delphi程序的代码。如何将Delphi字符串传递给Prism DLL?
如何将字符串从Delphi传递给Delphi Prism DLL?
我们尝试从原生Delphi程序传递一个字符串到Delphi Prism DLL。 传递整数没有问题,但字符串在DLL中不匹配。 我们在回答另一个问题时看到了Robert Love's code snippet,但是没有原生Delphi程序的代码。如何将Delphi字符串传递给Prism DLL?
如何将字符串从Delphi传递给Delphi Prism DLL?
Delphi Win32中的字符串与.Net中的字符串的管理方式不同,因此无法将.Net字符串传递给Delphi Win32,反之亦然。
要交换字符串值,最好使用两种编译器支持的PChar类型。这与将字符串值发送给Windows API函数的方式相同。
Regards
P.S.我不是罗伯特;-)
对不起,这应该是一个消息给上面提到的代码片段的作者。点击了错误的按钮。 但无论如何,它如何使用PChar。德尔福棱镜没有PChar类型。如果我在本地delphi中使用pchar,并在棱镜中使用字符串,我会得到第一个字符。但只有一个字符。 如何解决这个问题? – 2010-02-16 15:33:09
别担心,马库斯。你还没有足够的声望点,所以你无论如何都不能在别人的问题上发表推荐。这是一个合法的问题。我已经为你编辑它,所以它看起来不像你想发送一个直接的消息,而Stack Overflow不支持。 – 2010-02-16 15:37:40
PChar只是一个指向字符的指针,要发送一个字符串就像你需要先指向第一个字符,然后指定字符串数据的长度,这样另一端就可以从开始点读取数据直到字符串的长度。 如果您的DLL函数正在返回任何字符串值,那么另一端应该提供一个内存空间,并将其起始地址和长度发送给您的函数,以便您的函数可以将输出数据写入该内存空间。 – vcldeveloper 2010-02-16 15:41:02
最好的方法是使用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进行编译时(这取决于原始的开发系统是什么),你会遇到异常。
这是一个社区,所以你不应该在你的问题中为单个人解决问题。如果你想这样做,他的答案写评论。如果你写一个问题(在这种情况下更好),尽量将其表述为一般。 – jpfollenius 2010-02-16 13:41:04
同意。罗伯特吉塞克比我能做得更好。 – 2010-04-19 15:05:47