2013-09-06 2 views
5

При открытии, например. таблица с pywin32, я нашел два варианта, чтобы сделать это:Использование pywin32, в чем разница между Dispatch и DispatchEx?

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 может быть для удаленного доступа.

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

+0

Учитывая, что 'DispatchEx' не задокументирован и' Disp'', кажется довольно очевидным, что вы должны использовать последний, если у вас нет веских оснований для этого. Если вы задаете практический вопрос, это ответ. Если вы хотите знать, как все работает под капотом, нам, вероятно, нужно посмотреть на источник. – abarnert

ответ

11

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

+1

Я использую Dispatch и в любом случае открывает новый экземпляр Excel. Зачем? Я хочу подключиться к уже открытому экземпляру. Как мне это сделать? –

3

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

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

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

Вы можете посмотреть IDispatchEx на MSDN, и вы увидите, что это

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

Идея заключается в том, что, если вещь вы автоматизации является динамическим объектом (как вид объекта, который вы имеете в Python или Javascript), а не статический объект (как вид объекта, который вы имеете в C++ или Java), код Visual Basic может получить доступ к своим динамическим параметрам - перечислять, добавлять и удалять элементы во время выполнения и т. Д.

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

1

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

Использование DispatchEx вместо отправки

+0

Что пойдет не так с 'Dispatch'? – pandita

+2

Что-то, с чем я столкнулся, может пойти не так с Диспетчером.Если вы пишете графический интерфейс (или что-то в нем) и хотите выполнить некоторую фоновую работу в потоке, требующем экземпляра com-объекта, вы должны сначала вызвать pythoncom.CoInitialize(), или вы получите кучу com_errors. Теперь, если вы попытаетесь сделать что-то на переднем плане, используя объект, созданный Dispatch, в то время как фоновая задача использует объект, созданный Dispatch (они будут ссылаться на одно и то же приложение), вызовы будут отклонены. DispatchEx исправляет это, используя отдельные экземпляры для потока. –

 Смежные вопросы

  • Нет связанных вопросов^_^