【问题标题】:Using pywin32, what is the difference between Dispatch and DispatchEx?使用pywin32,Dispatch和DispatchEx有什么区别?
【发布时间】:2013-09-10 00:46:06
【问题描述】:

打开时,例如一个带有 pywin32 的电子表格,我找到了两个选项:

excel1 = win32com.client.DispatchEx('Excel.Application')
wb = excel1.Workbooks.Open('myxls.xls')

或者我可以这样做

excel2 = win32com.client.Dispatch('Excel.Application')
wb = excel2.Workbooks.Open('myxls.xls')

我想知道这是否有什么不同。文档字符串对我也没有多大帮助:

>>> w32.Dispatch.__doc__
'Creates a Dispatch based COM object.\n '

>>> w32.DispatchEx.__doc__
'Creates a Dispatch based COM object on a specific machine.\n  '

this 站点中,他们建议DispatchEx 可能用于远程访问。

当我只是想在自己的 PC 上自动化电子表格时,我使用哪种方法有什么不同吗?

【问题讨论】:

  • 鉴于DispatchEx 没有记录而Dispatch 是,很明显你应该使用后者,除非你有充分的理由不这样做。如果您要问一个实际问题,那就是答案。如果你想知道事情是如何运作的,那么我们可能需要查看源代码。

标签: python excel pywin32


【解决方案1】:

这取决于你想要什么。如果 Excel 已经打开,使用 dispatch 将在打开的 Excel 实例中创建一个新选项卡。如果 Excel 已经打开,使用 dispatchEx 将打开一个新的 Excel 实例。

【讨论】:

  • 我正在使用 Dispatch,它无论如何都会打开一个新的 Excel 实例。为什么?我想连接到已经打开的实例。我该怎么办?
  • 我也发现了there。但是查看source code,您可以看到它使用CoCreateInstanceEx()。对此的评论是Create a new instance of an OLE automation server possibly on a remote machine. 也许新实例是新自动化服务器的副作用?
【解决方案2】:

DispatchEx 没有记录,Dispatch 有记录,这已经暗示了实际的答案:只需使用 Dispatch,除非您有充分的理由相信自己有特殊情况。

但是,如果您想了解背后的差异:

the pywin32 source,您可以看到DispatchEx 尝试返回一个包装好的IDispatchEx 接口而不是IDispatch。 (鉴于名称,这并不令人惊讶。)

你可以在 MSDN 上查找IDispatchEx,你会看到它是

IDispatch 接口的扩展,支持适用于动态语言(如脚本语言)的功能。

想法是,如果您要自动化的对象是动态对象(如 Python 或 Javascript 中的对象类型),而不是静态对象(如 C++ 或 Java 中的对象类型) ),Visual Basic 代码可以访问其动态特性——在运行时枚举、添加和删除成员等。

当然,pywin32 几乎可以做 VB 可以做的所有事情,但有时你只需要更明确一点。在这种情况下,你需要创建一个DispatchEx,并调用它的DeleteMemberByName等方法。

【讨论】:

    【解决方案3】:

    如果您使用 COM 来自动化,例如 Excel,那么您有时会希望 .Dispatch 启动应用程序的新实例,而不是干扰已经在桌面上运行的实例。

    使用 DispatchEx 代替 Dispatch

    【讨论】:

    • 我刚刚遇到的事情可能会在 Dispatch 中出错。如果您正在编写 GUI(或任何线程)并希望在需要 com 对象实例的线程中做一些后台工作,您必须首先调用 pythoncom.CoInitialize() 否则您将得到一堆 com_errors。现在,如果您尝试使用 Dispatch 创建的对象在前台执行某些操作,而后台任务正在使用 Dispatch 创建的对象(它们将引用同一个应用程序),调用将被拒绝。 DispatchEx 通过为每个线程使用单独的实例来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多