在python中用win32com加载COM对象时出现问题

2024-10-04 07:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过COM对象与应用程序(数字显微照片)通信。这在LabView中有效,我现在正试图用win32com在python中做同样的事情。我得到了一系列的错误,这取决于我如何在win32com中实现这一点,这些都是没有意义的。在

如果我遵循quick start guide并尝试使用win32com.client.Dispatch(),那么我得到的对象除了来自win32com的默认值之外没有任何方法或类,尽管我知道makepy生成的模块有方法。在

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

仅返回

^{pr2}$

如果我改为使用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()来绕过这个bug,这允许我创建一个类的实例,但是当我试图运行类中的一个方法时,最终还是失败了:

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'

当我在google上搜索这些bug时,我看到人们在谈论32位到64位的问题。我在Anaconda中运行32位windows7和32位python3.7,使用通过Anaconda安装的pywin32。我还使用安装在python.org网站和pywin32通过pip安装并得到相同的第一个错误。我尝试与之通信的应用程序也是32位的。有人知道怎么回事吗?在


Tags: 方法instanceinimportselfclientnone错误