Python中如何解决pywintypes.com_error: (-2147221005, '无效的类字符串')错误

  1. https://github.com/nateshmbhat/pyttsx3/issues/32
  2. https://bbs.csdn.net/topics/392378574
  3. https://blog.csdn.net/bamuta/article/details/44460187
  4. https://segmentfault.com/q/1010000014342682
  5. https://www.cnblogs.com/jiangzhaowei/p/6815958.html 参考了这五个连接 python 32bit 64bit 都不行

安装了 : Speech SDK 5.1

pytts3 pywin32 安装了

python 代码就是简单的一个 tts 调用, 应该是环境的问题。。。但是不知道怎么办了, speech sdk3 找不到下载

# -*- coding: utf-8 -*-
import pythoncom
from win32com import client

pythoncom.CoInitialize() engine=client.Dispatch(“SAPI.SpVoice”) engine.Speak(‘hello world’)

报错如下:


$ C:\Python36-32\python.exe test.py Traceback (most recent call last): File “C:\Python36-32\lib\site-packages\win32com\client\dynamic.py”, line 89, in GetGoodDispatch IDispatch = pythoncom.connect(IDispatch) pywintypes.com_error: (-2147221005, ‘无效的类字符串’, None, None) During handling of the above exception, another exception occurred: Traceback (most recent call last): File “test.py”, line 5, in <module> engine=client.Dispatch(“SAPI.SpVoice”) File "C:\Python36-32\lib\site-packages\win32com\client_init.py", line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) File “C:\Python36-32\lib\site-packages\win32com\client\dynamic.py”, line 114, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File “C:\Python36-32\lib\site-packages\win32com\client\dynamic.py”, line 91, in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221005, ‘无效的类字符串’, None, None)


Python中如何解决pywintypes.com_error: (-2147221005, '无效的类字符串')错误

6 回复

说明 SAPI.SpVoice 这个 ProgID 没有注册


这个错误通常是因为你尝试通过COM接口创建对象时,传入的ProgID或CLSID字符串格式不对,或者系统里压根没注册这个COM组件。

最常见的情况是你用了win32com.client.Dispatch(),但给的类名不对。比如你想操作Excel却写错了版本号:

import win32com.client

# 错误示例 - Excel 2016的ProgID是"Excel.Application",不是"Excel.Application.16"
try:
    # 这个会报错:(-2147221005, '无效的类字符串')
    excel = win32com.client.Dispatch("Excel.Application.16")
except Exception as e:
    print(f"错误: {e}")

# 正确写法
excel = win32com.client.Dispatch("Excel.Application")  # 通用版本
# 或者
excel = win32com.client.Dispatch("Excel.Application.16")  # 具体版本(如果已安装)

检查ProgID是否正确,用系统的注册表编辑器(regedit)搜一下你要用的组件到底注册了什么名字。比如搜"Excel.Application"看看有没有。

如果是自己写的COM组件,记得先注册:regsvr32 yourdll.dll

总结:检查COM类名字符串是否正确,确认组件已注册。

亲测 Python3.6.7 32 位,网上下载了 dll 文件,然后注册了 dll,复制你的代码完美运行。
没有安装你提供的那个 sdk,没有安装你的 pytts3,完美运行,你可以参考下,是不是你安装的版本什么的不对。

你下载的那个 dll?

我直接百度了一个,SAPI.SpVoice 以这个为关键字搜索的一个 zip 文件,然后注册了直接就可以调用了

谢谢了 大概率是我的系统是精简版被阉割了

回到顶部