Зарегистрируйте 32-битный COM-класс для использования в 64-битном Python без прав администратора - PullRequest
0 голосов
/ 09 мая 2019

Я делаю скрипт на Python, который использует API сценариев GUI SAP через win32com.Первое использование выглядит следующим образом:

from win32com.client import Dispatch
objWrapper = Dispatch("SapROTWr.SapROTWrapper")

Это прекрасно работает при использовании 32-разрядного интерпретатора Python, но не при использовании 64-разрядного интерпретатора, что выдает ошибку «Класс не зарегистрирован». Есть ли способ сделать это, особенно без прав администратора?

Ответ по умолчанию, вероятно, будет выглядеть примерно так: "64-разрядный процесс не может загрузить 32-разрядныйDLL ", но я подозреваю, что это может быть как-то сделано, потому что:

  1. Эта ссылка упоминает процесс" COM Surrogate ", который может решить проблему, что по моим поискам показывает, что сама DLL может быть загружена dllhost.exe. Комментарий к этому ответу затрагивает метод, но не решает его.

  2. Приложения MS Office, как, например, Excel, делают это без проблем.Выполнена даже самая сложная часть, которая позволяет 32-битному приложению получить доступ к 64-битному серверу.Я просто не уверен, как это сделать, так как COM немного похож на черную магию, и я не знаю, смогу ли я сделать это с сторонними DLL, такими как SAP.Отсутствие прав администратора усложняет ситуацию.

  3. Мне фактически разрешено использовать API сценариев SAP GUI из 64-битного Excel (64-битного) VBA.Ниже приведен пример модуля, для которого я не должен был редактировать ссылки VBA:

Public Sub SimpleSAP()
  Set SapGuiAuto = GetObject("SAPGUI")  'Get the SAP GUI Scripting object
  Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
  Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
  Set session = SAPCon.Children(0) 'Get the first session (window) on that connection

  'Start a transaction
  session.StartTransaction "IH01"
End Sub

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

1 Ответ

0 голосов
/ 10 мая 2019

64-битный процесс не может напрямую загрузить 32-битный внутрипроцессный COM-сервер (т. Е. DLL) и наоборот по очевидным причинам (т. Е. Несоответствие по битности).

Приложения MS Office не являются внутрипроцессными серверами, они внепроцессных серверов (т. Е. Они запускаются в своих собственных EXE-файлах), поэтому они этого не делают.страдают от этой проблемы.COM может использоваться через границы процесса, независимо от разрядности каждого процесса, так как вызовы в / из COM-объекта маршалируются при необходимости.

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

...