将Delphi PChar传递给C#

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的残酷软件版本不匹配。我已经谷歌搜索过了,但目前还没有发现解决方案。
欢迎提供任何帮助 :)

1
请在C#端显示DelphiFunction的声明。 - David Heffernan
@David Heffernan 什么声明?我对 Delphi-to-c# 这个东西还很陌生,不太明白你在问什么 :D - Martin R
@DavidHeffernan C# 声明 c# 函数,Delphi 有自己的函数声明。我在 Delphi 端声明和编写过程,在 c# 中导入控件并直接调用这些过程。 - Martin R
是的。导入过程会生成声明代码。这就是问题中缺少的内容。 - David Heffernan
@DavidHeffernan 刚刚发表了评论。 - Martin R
显示剩余2条评论
1个回答

1
你的Delphi函数在交互方面设计不正确。如果Delphi函数返回一个字符串,则需要同意使用共享堆以便被调用者可以分配字符串并且调用者可以释放它。
处理这个问题的正常方式是使用COM BSTR,它在Delphi中由WideString封装。这使用了共享的COM堆,因此您可以在一个模块中分配并在另一个模块中释放。
无法将WideString用作交互的返回值,因为Delphi使用与MS工具不同的ABI来返回值。这在这里讨论得更详细:为什么不能将WideString用作交互的函数返回值? 因此,您应该通过输出参数返回字符串:
procedure Foo(const Input: WideString; out Output: WideString);

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

请记住,您没有提供有关如何将此Delphi库导入C#代码的任何详细信息。所以我在摸索中工作。我不知道您是否重新将组件导入C#中。请继续尝试。您仍未展示我在评论中要求的信息。请编辑问题以显示此信息。 - David Heffernan
我编译并构建 Delphi 项目。然后使用控制台 regsvr 命令注册 DLL。接着我打开 VS 并从工具箱中选择 Delphi 组件。 - Martin R
所以你需要进行一些调试。检查重新导入是否正常工作。添加一个没有参数的函数。当您重新导入时,它是否可用。然后再添加一个带有整数参数的函数,接着是一个带有宽字符串参数的函数,以此类推。将问题框定。 - David Heffernan
它可以工作 :) VS和Delphi只是有一个bug,所以新创建的过程/函数没有显示出来。我创建了新项目,重新注册了它们,然后就完成了!非常感谢 :) - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接