使用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