gpt4 book ai didi

.net - 如何检查 COM 对象是否仍然存在

转载 作者:行者123 更新时间:2023-12-04 20:03:39 25 4
gpt4 key购买 nike

我基本上了解托管 RCW 对象如何在 .NET 中包装 COM 对象。我的问题是当 COM 对象不再存在时会发生什么。我知道 RCW 对象会增加引用计数,因此只要 RCW 对象还活着,就不应该释放 COM 对象。但是如果从用户的角度删除 COM 对象呢?

  • 假设我有 PowerPoint 中的形状、Excel 中的工作表或 Word 段落。我的应用程序创建了一个引用并保留了一段时间。
  • 用户现在可以删除 PowerPoint 幻灯片、关闭 Excel 文件或删除 Word 段落。检测这个的正确方法是什么?

  • 尝试它表明 COM 对象抛出 COMException错误代码 0x80004005 表示访问任何属性时对象不存在。

    但我想知道:这是一种可靠且防故障的方法吗? COM 对象真的会留在 RCW 对象中还是 Office 可能会将其从内存中删除?在这种情况下,使用悬空引用是不是很危险,有没有更好的方法?

    最佳答案

    你正在做的事情本质上是有风险的。在用户与 Office 程序交互时使用自动化很棘手,您必须仔细编码。特定的 COM 对象不会被删除,它们是引用计数的,并且您持有对它的引用。但是当用户从文档中删除它时,内存中只剩下一个对象,它当然不再是文档的一部分。

    尝试取消引用该对象的成员确实很可能会失败。 Office 程序本身可能已删除对象保留的任何内部引用。你得到了一个非常糟糕的异常,这也不罕见,0x80004005 是 E_FAIL,“未指定的错误”。这几乎不能称为错误,它只是教师对错误报告质量的评分。

    理想情况下,您会收到一个事件,告诉您删除对象引用。很难获得,Office 应用程序并不那么健谈。最好的办法是根本不持有引用资料,而是在需要时随时找回。如果这不切实际,那么您可以将 try/catch-em-all 作为最终的后备 hack。

    关于.net - 如何检查 COM 对象是否仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453878/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com