【发布时间】: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