在delphi导入的activeX控件在c#环境下进行数据传输时遇到了一些问题。
我在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 2012。我搜索了这个,但到目前为止没有运气。
(感谢任何帮助:)
发布于 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参数返回字符串:
procedure Foo(const Input: WideString; out Output: WideString);您的C#类型库将能够正确导入。
https://stackoverflow.com/questions/16457900
复制相似问题