我有一组用Delphi.NET (Delphi1.1)编写的库,我想在我的Win32 (.NET )应用程序中使用它们。对于与性能相关的问题,我决定遵循COM路线。
有时,在重新生成动态链接库之后,当我尝试实例化通过COM公开的对象时,Win32应用程序在CreateComObject调用时挂起。我该如何解决这个问题?
为了通过COM公开Delphi.NET库,我在每个类减速之上添加了以下属性:
[Comvisible(true)]
[Guid('some guid')]
[ClassInterface(ClassInterfaceType.AutoDual)] 编译完动态链接库之后,我生成了一个TLB.pas文件,该文件包含动态链接库中所有公共和COM可见的类和接口的定义。这个文件使我可以更容易地在我的Delphi Win32应用程序中使用COM对象。最后,我使用regasm注册.dll和.tlb文件。
我尝试注销并运行引用DLL的Win32应用程序;我预计会收到运行时错误,但应用程序再次在CreateComObject()调用时挂起。
我也尝试过取消注册和注册DLL,但都没有成功。
附注:我正在使用BDS 2006
发布于 2009-01-26 19:26:11
我对COM有不同的体验;COM有时很难稳定下来,所以如果不需要的话,我通常会选择另一种方式。
在这种情况下,您可以尝试使用逆向P/Invoke绕过COM。
这里有几篇文章可以帮助你做到这一点:
http://blogs.codegear.com/timjarvis/2006/11/10/29270 http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm http://www.blong.com/Conferences/BorCon2004/Interop1/Win32AndDotNetInterop.htm
当你在"Delphi Inverse PInvoke"上搜索时,你可以得到更多的点击量,但上面的文章是最好的。
致以亲切的问候,
Jeroen Pluimers
发布于 2009-01-20 09:24:35
请确保以正确的方式关闭代码,而不只是在调试器中停止它。我发现使用调试器杀死进程间应用程序会导致各种问题,通常需要重新启动才能清除这些问题。做这件事需要纪律,因为通常情况下你可以毫无问题地做到这一点。
发布于 2009-02-23 07:51:27
使用RemObjects Hydra是混合托管和非托管Delphi代码的一种简单方法。但不幸的是,它相当昂贵-499美元:(
更新:尝试Delphi.Net开源项目。此项目处于非活动状态,但您可以将其用于Win32 -> dotNet1.1程序集交互。
https://stackoverflow.com/questions/460486
复制相似问题