Получить работающий экземпляр COM-объекта в Python с помощью pywin32

#python #windows #com #win32com

#python #Windows #com #win32com

Вопрос:

Я пытаюсь автоматизировать действия в Reflection Desktop из python. Я успешно делал это с помощью VBA раньше, например:

 Set Session = CreateObject("Reflection Workspace")
  

Затем это дает мне активный сеанс:

 Set Screen = Session.GetObject("Frame").SelectedView.Control.Screen
  

или это дает мне конкретный сеанс:

 Set Screen = Session.tView(iView).Control.Screen
  

При выполнении этого из python я ожидал, что COM-объект должен быть таким же, и на основе этого руководства Прикрепиться к запущенному экземпляру COM-приложения, которое я должен иметь возможность подключать к запущенному приложению, подобному этому:

 system = win32com.client.GetObject('Reflection Workspace') 
  

и хотя это не возвращает никаких ошибок, я также не могу найти никаких полезных атрибутов. Если я вместо этого использую:

 system = win32com.client.gencache.EnsureDispatch('EXTRA.System')
  

Я могу получить активный сеанс, используя:

 screen = system.ActiveSession.Screen
  

и все работает. Если я запущу

 win32com.client.combrowse.main()
  

и посмотрите на запущенные объекты, в списке указано рабочее пространство Reflection, а не EXTRA.System.

Я также использовал

 win32com.client.makepy.main() 
  

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

Итак, мои вопросы на данный момент:

  1. Если COM-браузер показывает рабочее пространство Reflection, а не EXTRA.System, почему я могу подключиться к EXTRA.System в качестве запущенного процесса?

  2. Почему я могу подключиться к Reflection Workspace, но ни один из атрибутов COM, доступных при использовании VBA, не доступен при использовании python?

  3. Может кто-нибудь указать на руководство о том, как на самом деле назначить запущенный COM-процесс объекту, используя библиотеку, созданную makepy () ?

Комментарии:

1. VBA взаимодействует с IDispatch интерфейсом. Верно ли это и для Python?

Ответ №1:

В итоге я нашел решение этой проблемы. Похоже, что COM API «EXTRA.System» сохранен для совместимости с устаревшими, а «Рабочее пространство отражения» следует использовать для новой разработки.

Я был уверен, что уже пробовал, но после публикации вопроса я снова попытался использовать GetObject для получения объекта reflection frame, и это сработало. Итак, для всех, кто пытается сделать это на python, вы можете использовать объект приложения, используя:

 system = win32com.client.GetObject('Reflection Workspace')
  

затем получите активное представление:

 screen = system.GetObject("Frame").SelectedView.Control.Screen
  

или получить конкретное представление, где 1 — номер представления:

 screen = system.GetObject("Frame").view(1).Control.Screen
  

После этого методы такие же, как в документации для GetText, PutText и т.д.