Используя pywin32, в чем разница между Dispatch и DispatchEx?

при открытии, например, электронной таблицы с 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  '

на этой сайт они предполагают, что DispatchEx может быть для удаленного доступа.

имеет ли значение, какой метод я использую, когда я просто пытаюсь автоматизировать электронные таблицы на своем компьютере?

3 ответов


Это зависит от того, что вы хотите. Если Excel уже открыт, с помощью dispatch будет создана новая вкладка в экземпляре open Excel. Если Excel уже открыт, с помощью dispatchEx откроется новый экземпляр Excel.


DispatchEx не документированы, и Dispatch есть, что уже подразумевает практический ответ: просто используйте Dispatch, если у вас нет очень веских причин полагать, что у вас есть особый случай.

однако, если вы хотите знать различия под обложками:

С в pywin32 источник видно, что DispatchEx пытается вернуть завернутый IDispatchEx интерфейс, а не IDispatch. (Неудивительно, учитывая имена.)

вы можете искать IDispatchEx в MSDN, и вы увидите, что это

расширение интерфейса IDispatch, поддерживает функции, подходящие для динамических языков, таких как языки сценариев.

идея в том, что, если вы автоматизируете это динамический объект (как объекта в Python или JavaScript), а не статичный объект (например, какой объект вы имеете в C++ или Java), визуальный основной код может получить доступ к его динамическим nature-перечисление, добавление и удаление членов во время выполнения и т. д.

и, конечно, pywin32 может сделать почти все, что может VB, вам просто нужно быть немного более явным иногда. В этом случае, вам нужно создать DispatchEx, и назвать его DeleteMemberByName etc. методы.


Если вы используете COM для автоматизации, скажем, Excel, придет время, когда вы захотите .Отправка для запуска нового экземпляра приложения, чтобы не мешать уже запущенному на рабочем столе.

используйте DispatchEx вместо Dispatch