将Delphi PChar传递给c#
本文关键字:Delphi PChar | 更新日期: 2023-09-27 18:12:42
在c#环境中delphi导入activeX控件时,在传输数据时遇到了一些问题。
我在delphi端有一个函数,它接受并返回PChar。我可以修改它或者做任何我想做的事情。
function TActiveFormX.DelphiFunction(S: PChar): PChar;
begin
///do something with 'S'
result:=S;
end;
在程序的c#端是一个函数,它调用delphi函数,给它一个字符串形参。
public void CSharpFunction()
{
string a = axActiveFormX1.DelphiFunction("sampleString");
}
我已经测试过了,显然一切都很顺利,直到c#接收返回的PChar。然后当整个应用程序停止响应并退出时。我试图实现try-catch块来查看异常消息,但应用程序在显示任何内容之前就崩溃了。
我想它崩溃是因为变量不属于同一类型。或者因为软件版本不匹配:Delphi 5 + Visual Studio 2012。我谷歌了一下,但到目前为止还没有找到。
感谢任何帮助:)
您的Delphi函数没有正确设计用于互操作。如果Delphi函数返回一个字符串,那么你需要同意使用共享堆,以便调用者可以分配字符串,调用者可以释放它。
处理此问题的正常方法是使用COM BSTR,它在Delphi中由WideString封装。它使用共享的COM堆,所以你可以在一个模块中分配,在另一个模块中释放。
不可能使用WideString作为互操作的返回值,因为Delphi使用不同于MS工具的ABI作为返回值。这里更详细地讨论了:为什么WideString不能用作互操作的函数返回值?
所以你应该通过out参数返回字符串:
procedure Foo(const Input: WideString; out Output: WideString);
你的c#类型库将能够正确导入它