Проблемы загрузки COM-объекта с win32com в Python - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь связаться с приложением (цифровой микрофотографией) через COM-объект. Это работает в LabView, и сейчас я пытаюсь сделать то же самое в python с win32com. Я получаю ряд ошибок в зависимости от того, как я реализую это в win32com, которые на самом деле не имеют смысла.

Если я следую краткому руководству и попытаюсь использовать win32com.client.Dispatch(), у получаемого объекта не будет методов или классов, кроме значений по умолчанию из win32com, хотя я знаю, что модуль, сгенерированный makepy, имеет методы .

import win32com.client
sendDMscript = win32com.client.Dispatch('COMExamplePlugIn.COMExampleInterface')
dir(sendDMscript)

возвращает только

['_ApplyTypes_',
 '_FlagAsMethod',
 '_LazyAddAttr_',
 '_NewEnum',
 '_Release_',
 '__AttrToID__',
 '__LazyMap__',
 '__bool__',
 '__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__int__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_builtMethods_',
 '_enum_',
 '_find_dispatch_type_',
 '_get_good_object_',
 '_get_good_single_object_',
 '_lazydata_',
 '_make_method_',
 '_mapCachedItems_',
 '_oleobj_',
 '_olerepr_',
 '_print_details_',
 '_proc_',
 '_unicode_to_string_',
 '_username_',
 '_wrap_dispatch_']

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

import win32com.client
sendDMscript_method = win32com.client.gencache.GetModuleForProgID('COMExamplePlugIn.COMExampleInterface').ICOMExampleInterface
instance = sendDMscript_method()

Это возвращает

---------------------------------------------------------------------------
com_error                                 Traceback (most recent call last)
<ipython-input-4-55d05602784d> in <module>
----> 1 instance = sendDMscript()

~\Anaconda3\lib\site-packages\win32com\client\__init__.py in __init__(self, oobj)
    429         def __init__(self, oobj=None):
    430                 if oobj is None:
--> 431                         oobj = pythoncom.new(self.CLSID)
    432                 elif isinstance(oobj, DispatchBaseClass):
    433                         try:

com_error: (-2147221164, 'Class not registered', None, None)

Я попытался обойти эту ошибку, передав правый oobj в качестве аргумента sendDMscript_method(), и это позволяет мне создать экземпляр класса, но в конечном итоге также не удается, когда я пытаюсь запустить один из методы в классе:

import win32com.client
from pywintypes import IID
sendDMscript_method = win32com.client.gencache.GetModuleForProgID('COMExamplePlugIn.COMExampleInterface').ICOMExampleInterface
CLSID = IID('{8C0B6A41-4ED2-4B44-B7B1-6492695B9C3D}')
instance = sendDMscript_method(CLSID)
instance.ExecuteScript(script='result("I did it")')

Это приводит к ошибке:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-8fdc545bf83d> in <module>
----> 1 instance.ExecuteScript(script='result("I did it")')

C:\Users\VALUED~1\AppData\Local\Temp\gen_py\3.7\8C0B6A41-4ED2-4B44-B7B1-6492695B9C3Dx0x2x0.py in ExecuteScript(self, script)
     57         def ExecuteScript(self, script=defaultNamedNotOptArg):
     58                 'method ExecuteScript'
---> 59         return self._oleobj_.InvokeTypes(1, LCID, 1, (5, 0), ((8, 1),),script
     60             )
     61 

AttributeError: 'PyIID' object has no attribute 'InvokeTypes'

Когда я гуглил эти ошибки, я видел людей, говорящих о 32-битных-64-битных проблемах. Я использую 32-разрядную Windows 7 с 32-разрядным Python 3.7 в Anaconda, используя pywin32, установленный через Anaconda. Я также проверил подход руководства по быстрому старту с 32-битным python 3.7, установленным с python.org и pywin32, установленным через pip, и получил ту же первую ошибку. Приложение, с которым я пытаюсь установить связь, также 32-разрядное. Кто-нибудь знает, что идет не так?

...