首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Delphi PChar传递给C#

将Delphi PChar传递给C#
EN

Stack Overflow用户
提问于 2013-05-09 08:51:17
回答 1查看 1.8K关注 0票数 3

在delphi导入的activeX控件在c#环境下进行数据传输时遇到了一些问题。

我在delphi上有一个函数,它接受并返回PChar。我可以修改它或者用它做任何我想做的事。

代码语言:javascript
复制
function TActiveFormX.DelphiFunction(S: PChar): PChar;
begin
    ///do something with 'S'
    result:=S;
end;

在程序的C#端是一个函数,它调用delphi,给它一个字符串参数以供咀嚼。

代码语言:javascript
复制
public void CSharpFunction()
{
    string a = axActiveFormX1.DelphiFunction("sampleString");
}

我已经对它进行了测试,显然,在C#收到返回的PChar之前,一切都进行得很顺利。当整个应用程序停止响应并退出时。我试着实现try-catch块来查看异常消息,但是应用程序在显示任何信息之前都会崩溃。

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

(感谢任何帮助:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-09 08:59:49

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

处理这一问题的通常方法是使用COM,它是由Delphi中的WideString封装的。这使用共享COM堆,这样您就可以在一个模块中分配,而在另一个模块中释放。

不可能使用WideString作为互操作的返回值,因为Delphi对返回值使用了与MS工具不同的ABI。这里将更详细地讨论这一点:Why can a WideString not be used as a function return value for interop?

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

代码语言:javascript
复制
procedure Foo(const Input: WideString; out Output: WideString);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16457900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档