首页 > 解决方案 > 即使我启动服务器应用程序,COM 对象也会不断返回存根

问题描述

我有一个程序

 repo = win32com.client.Dispatch("EA.App").Repository

这一直很好。但是,一旦我在 EA.app 实例未运行时调用它,我就会永久地得到垃圾

<COMObject <unknown>>

作为回报 - 直到我重新启动 Windoze。那是什么?更重要的是:我如何绕过重启?

PS 写完后我发现

 repo = win32com.client.Dispatch("EA.App")

返回

<COMObject EA.App>

那么,我可以假设这是 EA.app 做得不对吗?

标签: pythonwin32com

解决方案


win32com.client.Dispatch("EA.App")创建EA.AppCOM 类的新实例。

我假设将 COM 对象连接到“EA.app 实例”或其他任何东西(可能通过 IPC 通道)发生在创建时,所以如果它没有运行,你最终会得到一个仍然如此的虚拟对象。

也许 COM 类有一些方法可以强制它重新发现服务器应用程序,而不必重新创建 COM 对象。但是由于重新创建很容易,开发人员很可能认为这样的功能不会为产品增加足够的价值来证明费用是合理的。


一些 COM 类实现了某种单例模式Dispatch:多次调用将在内部使用第一个结果的“缓存”结果,并实际上返回以某种方式“相同”的对象。如果是这种情况,再打电话Dispatch也无济于事。在这种情况下,请检查 COM 类的文档和/或其供应商如何强制重新发现。(例如,可能有一种方法可以显式删除“缓存的”底层对象,以便下一个Dispatch创建一个新对象。)


推荐阅读