我有一个程序
repo = win32com.client.Dispatch("EA.App").Repository
而且一直都很好用。但是,一旦我在 EA.app 实例未运行时调用它,我就会永久收到垃圾
<COMObject <unknown>>
作为返回 - 直到我重新启动 Windoze。那是什么?更重要的是:如何绕过重启?
附言写完后我发现
repo = win32com.client.Dispatch("EA.App")
返回
<COMObject EA.App>
那么,我可以假设这是 EA.app 做错了什么吗?
最佳答案
win32com.client.Dispatch("EA.App")
创建 EA.App
COM 类的新实例。
我假设在创建时将 COM 对象连接到“EA.app 实例”或其他任何东西(大概通过 IPC channel ),所以如果它没有运行,你最终会得到一个虚拟对象仍然如此。
也许 COM 类有一些方法可以强制它重新发现服务器应用程序,而不必重新创建 COM 对象。但由于重新创建很容易,开发人员很可能认为这样的功能不会为产品增加足够的值(value)以证明支出是合理的。
一些 COM 类实现了某种 singleton pattern : 多次调用 Dispatch
将在内部使用第一个结果的“缓存”结果,并实际返回某种程度上“相同”的对象。如果是这种情况,再次调用 Dispatch
将无济于事。在这种情况下,请检查 COM 类的文档和/或其供应商如何强制重新发现。 (例如,可能有一种方法可以显式删除“缓存的”底层对象,以便下一个 Dispatch
创建一个新对象。)
关于python - 即使我启动服务器应用程序,COM 对象仍会返回一个 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58105184/