【问题标题】:Invoke call on released COM object在释放的 COM 对象上调用调用
【发布时间】:2011-11-23 12:09:20
【问题描述】:

我创建了一个 COM 对象,用于某些应用程序的自动化任务。发生这种情况时,应用程序将启动并显示其主窗口。

当用户关闭主应用程序窗口时会出现问题。对 COM 对象的 Next Invoke 调用不起作用。问题是它不会失败,也不会报告错误。如果我在下一行代码中放置调试器断点,则永远无法到达。如果我用 try/catch 包围 Invoke 调用,则不会捕获到异常。在发布版本中它只是崩溃。

这应该如何工作?由于我使用 CComDispatchDriver 作为 IDispatch* 的包装器,因此即使用户关闭了应用程序,我的 AddRef 也会使 COM 对象保持活动状态。我希望至少得到一些 HRESULT 作为错误。

【问题讨论】:

  • 显然您正在处理一个 cr*ppy COM 服务器。它应该继续运行并发送消息循环,直到您释放应用程序对象。你最好响应某种“退出”事件。如果没有,那么您将需要供应商的支持。
  • 没有事件。由于这是在 proc 调用之外,当 Invoke 没有找到目标消息循环时,是否期望 Invoke 返回错误?
  • COM 存根非常薄,没有超时。联系供应商,你不能是唯一一个有这个问题的人。
  • 作为一种解决方法,我认为有一种方法可以识别您正在与之通信的进程。然后,您可以打开它的句柄以监视它是否仍在运行。 (由于种族问题,这可能不会 100% 可靠,但总比没有好。)
  • 超时将出现在(默认)9-10分钟;如果您可以确定另一端不在拨号 POTS 调制解调器后面的 486 上(这就是默认值如此高的原因),您可以在全局或本地基础上减少时间跨度

标签: windows com invoke idispatch


【解决方案1】:

可能发生的情况是您的应用程序在退出时调用了 CoUninitialize。 CoUninitialize 会导致所有 COM 对象被丢弃,因此如果您在调用 CoUninitialize 后与 COM 对象进行交互,则会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2012-09-17
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多