9

When opening e.g. a spreadsheet with pywin32, I found two options to do so:

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

or I could do

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

and I'm wondering if this makes any difference. The docstrings don't help me much either:

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

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

In this site they suggest that DispatchEx might be for remote access.

Does it make any difference which method I use when I'm simply trying to automate spreadsheets on my own PC?

4

3 回答 3

13

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

于 2013-09-08T22:33:31.707 回答
5

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

但是,如果您想知道封面下的差异:

pywin32 源代码中,您可以看到它DispatchEx试图返回一个包装好的IDispatchEx接口,而不是IDispatch. (鉴于名称,这并不太令人惊讶。)

你可以看看IDispatchExMSDN,你会看到它是

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

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

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

于 2013-09-06T02:51:54.050 回答
2

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

使用 DispatchEx 而不是 Dispatch

于 2013-09-06T13:58:09.397 回答