即使我启动服务器应用程序,COM 对象仍会返回一个存根

COM object keeps returning a stub even if I start the server application

我有一个程序

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

而且一直都很好用。但是,一旦我在 EA.app 实例不是 运行 的情况下调用它,我就会永久得到垃圾

<COMObject <unknown>>

in return - 直到我重新启动 Windoze。那是什么?更重要的是:如何绕过重启?

P.S。写完后我发现

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

returns

<COMObject EA.App>

所以,我可以假设这是 EA.app 不正确的地方吗?

win32com.client.Dispatch("EA.App") 创建 EA.App COM class.

的新实例

我假设在创建时将 COM 对象连接到 "EA.app instance" 或其他任何东西(大概通过 IPC 通道),所以如果不是 运行,你最终有一个虚拟对象仍然如此。

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


某些 COM classes 实现了某种 singleton pattern:多次调用 Dispatch 将在内部使用第一个 "cached" 结果 return 以某种方式 "the same" 的对象。如果是这种情况,再次调用 Dispatch 将无济于事。在这种情况下,请检查 COM class' 文档 and/or 其供应商如何强制重新发现。 (例如,可能有一种方法可以显式删除 "cached" 底层对象,以便下一个 Dispatch 创建一个新对象。)