我试图通过使用win32com的COM接口来控制设备(GamryInterface5000恒电位器)。
# Imports
import win32com.client as client
# Get device list
devices = client.Dispatch('GamryCOM.GamryDeviceList')
# Iterate through devices
for i in range(devices.Count()):
# Get device (this wors as we only have one connected yet)
device = devices.EnumSections()[i]
print(device)
# Setup potentiostat object
potentiostat = client.Dispatch('GamryCOM.GamryPstat')当我运行这个程序时,我得到了以下错误消息:
IFC5000-10519
Traceback (most recent call last):
File "c:\Users\Rob\AppData\Local\Programs\Python\Python39-32\lib\site-packages\win32com\client\dynamic.py", line 86, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221021, 'Operation unavailable', None, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\Users\[...]\gamry_control_01.py", line 23, in <module>
potentiostat = client.Dispatch('GamryCOM.GamryPstat', clsctx = pythoncom.CLSCTX_LOCAL_SERVER )
File "c:\Users\Rob\AppData\Local\Programs\Python\Python39-32\lib\site-packages\win32com\client\__init__.py", line 117, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch, userName, clsctx)
File "c:\Users\Rob\AppData\Local\Programs\Python\Python39-32\lib\site-packages\win32com\client\dynamic.py", line 106, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "c:\Users\Rob\AppData\Local\Programs\Python\Python39-32\lib\site-packages\win32com\client\dynamic.py", line 88, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(
pywintypes.com_error: (-2147221164, 'Class not registered', None, None)有趣的是,第一条调度语句运行良好,而第二条语句失败。
我使用64位Windows 11安装程序并测试了不同的Python环境:
我还尝试使用comtype而不是win32com,这导致了同样的错误。
非常感谢您的帮助!
问候
发布于 2022-02-11 12:32:59
我也有同样的问题,联系了一个推销员。他给我发了一份文件,说在某些设备上,您必须使用pstat = client.CreateObject('GamryCOM.GamryPC5Pstat')作为参考系列,pstat = client.CreateObject('GamryCOM.GamryPC6Pstat')用于接口系列。对我来说,至少OSError: [WinError -2147221164] Class not registered消失了。我用过“组合”。
发布于 2022-02-07 14:42:31
“未注册的类”意味着它找不到该类的类工厂。这是一个独立于Python的错误,与it...other无关,与Python的bitness无关(无论是32位还是64位,以及COM服务器是32位还是64位)。服务器是否处于进程( DLL)或进程外(EXE)也很重要。对于EXE来说,这并不重要,但是对于进程内服务器,调用程序和COM服务器的比特必须匹配。为了看看你是否有痛苦的问题,做这个.
创建以下VB脚本,称之为test.vbs
set obj = CreateObject("GamryCOM.GamryDeviceList")
MsgBox TypeName(obj)从命令行调用脚本两次,一次使用64位VB脚本引擎,一次使用32位引擎。如果您是从test.vbs所在的其他目录运行的,则还必须提供到test.vbs的路径。
64位引擎:
c:\windows\system32\wscript.exe test.vbs32位引擎:
c:\windows\syswow64\wscript.exe test.vbs如果正确地注册了对象和EXE服务器,那么它应该成功地运行在32位和64位的脚本中。如果正确注册对象和DLL服务器,则该对象将只在上述脚本的一次运行中成功。如果对象被错误地注册,那么对于两个引擎运行的脚本,它都会失败。
在双重失败的情况下,您必须弄清楚COM对象的生产者希望您如何调用它。可能是许可证的问题。
在单个失败的情况下,您必须使用不同的Python比特来匹配服务器,或者,如果您确实像您所说的运行64位Python,那么也许可以想出一种使用DllHost之类的方法在64位中托管32位DLL。我从来没有做过,但是网上有关于如何做的文章。
发布于 2022-07-20 22:44:18
为了添加到64位vs32位COM对象中,本文对https://www.codeproject.com/Tips/267554/Using-32-bit-COM-Object-from-64-bit-Application很有帮助。
我将列出防止互联网衰退的步骤。
使用64位应用程序中的32位COM对象
HKey_Classes_Root/Wow6432Node/CLSID.
使用这些步骤,我创建了必要的.reg文件,以便在诸如切换计算机等情况下自动化进程。
https://stackoverflow.com/questions/71006655
复制相似问题