【问题标题】:Using .Net classes through COM Objects in Delphi sometimes hangs在 Delphi 中通过 COM 对象使用 .Net 类有时会挂起
【发布时间】:2010-10-02 09:48:06
【问题描述】:

我有一组用 Delphi.NET (.NET 1.1) 编写的库,我想在我的 Win32 (Delphi) 应用程序中使用它们。对于与性能相关的问题,我决定遵循 COM 路线。

有时,在重建 DLL 后,当我尝试实例化通过 COM 公开的对象时,Win32 应用程序在 CreateComObject 调用处挂起。我该如何解决这个问题?

为了通过 COM 公开 Delphi.NET 库,我在每个类减速上方添加以下属性:

[Comvisible(true)] 
[Guid('some guid')] 
[ClassInterface(ClassInterfaceType.AutoDual)] 

编译 DLL 后,我生成了一个TLB.pas 文件,该文件包含 DLL 中所有公共和 COM 可见类和接口的定义。这个文件允许我更容易地在我的 Delphi Win32 应用程序中使用 COM 对象。最后,我使用regasm注册.dll.tlb

我尝试注销并运行引用 DLL 的 Win32 应用程序;我预计会收到一个运行时错误,但应用程序再次挂起CreateComObject() 调用。

我也尝试过注销和注册 DLL,但没有任何运气。

附言我正在使用 BDS 2006

【问题讨论】:

  • 它只是挂起?没有CPU?没有错误?永远不会回来?
  • 是的,它永远不会从调用中返回,CPU 使用率也没有固定。
  • 它发生在其他语言中吗? C++ 还是 VB/VBScript?
  • 为了隔离问题,我使用 Ruby 实例化了 com 对象,它成功了!但是,我需要使用 Dephi 2007 (Win32) P.S.我正在单独装饰带有 ComVisible 属性的类,而不是整个程序集,这会有所不同吗?

标签: .net delphi com dll typelib


【解决方案1】:

我在 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" 上搜索时,您可以获得更多点击,但以上是最好的文章。

亲切的问候,

杰伦·普莱默斯

【讨论】:

    【解决方案2】:

    确保以正确的方式关闭代码,而不是仅仅在调试器中停止它。我发现使用调试器杀死进程间应用程序会导致各种问题,通常需要重新启动才能清除它们。这样做需要纪律,因为通常你可以毫无问题地做到这一点。

    【讨论】:

    • 应用程序。正常关机,我也试过重启我的机器。
    【解决方案3】:

    使用RemObjects Hydra 是一种混合托管和非托管Delphi 代码的简单方法。但不幸的是,它相当昂贵 - 499 美元 :(

    更新:试试Delphi.Net 开源项目。该项目处于非活动状态,但您可以将其用于 Win32 -> dotNet1.1 程序集交互。

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 2013-11-09
      • 2018-07-11
      • 2011-08-05
      • 2019-05-11
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多