使用pywin32,Dispatch和DispatchEx有什么不同?

当用pywin32打开一个电子表格时,我发现有两个select:

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 ' 

在这个网站他们build议DispatchEx可能是远程访问。

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

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

DispatchEx没有logging, Dispatch是,这已经暗示了实际的答案:只要使用Dispatch ,除非你有一个很好的理由相信你有一个特殊的情况。

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

从pywin32源代码 ,你可以看到DispatchEx试图返回一个封装的IDispatchEx接口而不是IDispatch 。 (不要太惊讶,因为名字。)

你可以在MSDN上查询IDispatchEx ,你会发现它是

IDispatch接口的扩展,支持适用于dynamic语言(如脚本语言)的function。

这个想法是,如果你自动化的东西是一个dynamic的对象(比如你在Python或者Javascript中的对象types),而不是一个静态的对象(比如你在C ++或Java中的types),Visual基本代码可以访问它的dynamic性质 – 在运行时枚举,添加和删除成员等。

当然,pywin32可以完成VB几乎所有的function,有时你需要更加明确。 在这种情况下,你需要创build一个DispatchEx ,并调用它的DeleteMemberByName等方法。

如果您使用COM来自动化,比如说Excel,则会有一段时间您需要.Dispatch启动应用程序的新实例,而不是干扰已经在桌面上运行的实例。

使用DispatchEx而不是Dispatch