将Delphi PChar传递给C#

时间:2013-05-09 08:51:17

标签: c# string delphi pchar

我在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块来查看Exception消息,但应用程序在显示任何内容之前就崩溃了。

我认为它因为变量不是同一类型而崩溃。或者因为残酷的软件版本不匹配:Delphi 5 + Visual Studio 2012.我用Google搜索了这个,但到目前为止没有运气。

任何帮助表示赞赏:)

1 个答案:

答案 0 :(得分:1)

您的Delphi功能设计不正确。如果Delphi函数返回一个字符串,那么你需要同意使用共享堆,以便被调用者可以分配字符串,并且调用者可以解除分配它。

处理这个的常用方法是使用COM BSTR,它由Delphi中的WideString包装。这使用共享COM堆,因此您可以在一个模块中分配并在另一个模块中解除分配。

由于Delphi使用MS工具中的不同ABI作为返回值,因此无法使用WideString作为互操作的返回值。这将在此处详细讨论:Why can a WideString not be used as a function return value for interop?

所以你应该通过out参数返回字符串:

procedure Foo(const Input: WideString; out Output: WideString);

您的C#类型库将能够正确导入。