首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python win32com -类未注册错误

Python win32com -类未注册错误
EN

Stack Overflow用户
提问于 2022-02-06 11:24:59
回答 3查看 1.8K关注 0票数 0

我试图通过使用win32com的COM接口来控制设备(GamryInterface5000恒电位器)。

代码语言:javascript
复制
# 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')

当我运行这个程序时,我得到了以下错误消息:

代码语言:javascript
复制
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环境:

  • Python 3.10 64位,win32com-303 64位
  • Python 3.9位,win32com-303 32位

我还尝试使用comtype而不是win32com,这导致了同样的错误。

非常感谢您的帮助!

问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-11 12:32:59

我也有同样的问题,联系了一个推销员。他给我发了一份文件,说在某些设备上,您必须使用pstat = client.CreateObject('GamryCOM.GamryPC5Pstat')作为参考系列,pstat = client.CreateObject('GamryCOM.GamryPC6Pstat')用于接口系列。对我来说,至少OSError: [WinError -2147221164] Class not registered消失了。我用过“组合”。

票数 1
EN

Stack Overflow用户

发布于 2022-02-07 14:42:31

“未注册的类”意味着它找不到该类的类工厂。这是一个独立于Python的错误,与it...other无关,与Python的bitness无关(无论是32位还是64位,以及COM服务器是32位还是64位)。服务器是否处于进程( DLL)或进程外(EXE)也很重要。对于EXE来说,这并不重要,但是对于进程内服务器,调用程序和COM服务器的比特必须匹配。为了看看你是否有痛苦的问题,做这个.

创建以下VB脚本,称之为test.vbs

代码语言:javascript
复制
set obj = CreateObject("GamryCOM.GamryDeviceList")
MsgBox TypeName(obj)

从命令行调用脚本两次,一次使用64位VB脚本引擎,一次使用32位引擎。如果您是从test.vbs所在的其他目录运行的,则还必须提供到test.vbs的路径。

64位引擎:

代码语言:javascript
复制
c:\windows\system32\wscript.exe test.vbs

32位引擎:

代码语言:javascript
复制
c:\windows\syswow64\wscript.exe test.vbs

如果正确地注册了对象和EXE服务器,那么它应该成功地运行在32位和64位的脚本中。如果正确注册对象和DLL服务器,则该对象将只在上述脚本的一次运行中成功。如果对象被错误地注册,那么对于两个引擎运行的脚本,它都会失败。

在双重失败的情况下,您必须弄清楚COM对象的生产者希望您如何调用它。可能是许可证的问题。

在单个失败的情况下,您必须使用不同的Python比特来匹配服务器,或者,如果您确实像您所说的运行64位Python,那么也许可以想出一种使用DllHost之类的方法在64位中托管32位DLL。我从来没有做过,但是网上有关于如何做的文章。

票数 1
EN

Stack Overflow用户

发布于 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.

  • Once

  • 下找到COM对象GUID,添加一个新的REG_SZ (string)值。名称应该是AppID,数据应该是您刚才搜索的COM对象GUID。

  • 在HKey_

  • _Root/Wow6432Node/AppID下添加了一个新密钥。新键应该与您刚才添加的新键下的COM对象GUID.

  • 相同,添加一个新的REG_SZ (string)值,并将其命名为DllSurrogate。如果empty.

  • Create值不存在,则在HKey_Local_Machine/Software/Classes/AppID下保留一个新键。同样,新键应该与COM对象的GUID相同。在此键下不需要添加任何值。

使用这些步骤,我创建了必要的.reg文件,以便在诸如切换计算机等情况下自动化进程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71006655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档