在C# DLL中调用Delphi5过程

3

我有一个大问题。我有一个Delphi 5应用程序,调用一个C# DLL。我想从我的C# DLL调用一个需要指向Delphi过程的指针作为输入参数的函数。在这个C#函数中,之后调用Delphi过程。

我尝试使用IntPtr在C#端声明函数指针:

ourFunction(IntPtr fct){
   ...
   helpFct = (OurType)Marshal.GetDelegateForFunctionPointer(fct, typeof(OurType));
   ...
}

如果我从C#调用该函数,则一切正常。但是,如果我想从Delphi(使用Delphi过程作为输入参数)调用它,则会崩溃,而不提供有关错误的任何信息。

以下是我的Delphi代码:

hBuffer : THandle;
buffer : PInteger;
...
hBuffer:=GlobalAlloc(GMEM_fixed,SizeOf(Integer));
buffer:=GlobalLock(hBuffer);
buffer := Addr(AddDelphi);
intfRef.ourFunction(buffer^);

有人遇到过这样的问题吗?或者对它可能如何工作有一些想法吗?

谢谢 斯特凡

2个回答

2
如果使用的是Delphi 5,那么它是预 .NET 时代的。你最好的选择是使用regasm将C#程序集注册为COM对象,并在Delphi 5应用程序中作为COM对象访问它,以便进行操作。
当然,你还需要检查并确保调用是与COM兼容的。

嗨,谢谢您的快速回复。对不起,当我谈到 dll 时我实际上是指 c# 程序集。我已经通过使用 COM 对象(一个简单的 Add 函数,返回结果)测试了通信。它运行正常。但我的问题在于函数指针的传递。 - Stefan

0

我不确定它是否适用于Delphi 5,但过去我成功地使用RemObjects Hydra将用C#编写的.NET内容集成到Delphi中(Hydra也可以反向操作:将Delphi内容集成到.NET中)。

函数指针会很困难,因为.NET运行时和Delphi运行时有很大的区别。

您可能想尝试的是将Delphi函数导出到DLL中,并从C#/.NET侧使用P/Invoke导入它们。 .NET将从Delphi DLL转换为.NET方式并返回。

最后,您可以尝试使用JCL TJclClrHost在Delphi中托管.NET运行时(有关更多信息,请参见this SO question)。

--jeroen


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