3

我在 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。我用谷歌搜索了这个,但到目前为止没有运气。

任何帮助表示赞赏:)

4

1 回答 1

1

您的 Delphi 函数没有为互操作正确设计。如果 Delphi 函数返回一个字符串,那么您需要同意使用共享堆,以便被调用者可以分配字符串,而调用者可以释放它。

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

不可能使用 WideString 作为互操作的返回值,因为 Delphi 使用与 MS 工具不同的 ABI 作为返回值。此处对此进行了更详细的讨论:为什么不能将 WideString 用作互操作的函数返回值?

因此,您应该通过 out 参数返回字符串:

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

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

于 2013-05-09T08:59:49.603 回答