如何使用pyrtd/pythoncom解决“pywintypes.com”错误?

2024-05-14 01:21:42 发布

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

我正在尝试使用Python的pyrtd模块来获取可以通过RTD在Excel中获得的信息。

但是,当我尝试运行sample python script时,会得到以下错误:

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

我尝试了其他几个RTD函数,有时(当我使用Dllname.function_name作为RTDClient()的参数时),我得到:

pywintypes.com_error:( -2147221005, 'Invalid class string', None, None)

所有这些RTD功能在Excel 2010中运行良好。

我还没有找到Python的解决方案,但是我已经研究了C#的一些技巧:

基本思想是:

  1. 通过ProgID从register表中获取rtd服务器的类类型(例如,RTDTime.RTD,如果已经使用了regsvr32来注册dll,则可以在HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD中找到它们)。

    在C中,函数是Type.GetTypeFromProgID()我相信Python模块中有一个相同的函数win32com

  2. 将服务器类强制转换为IRtdServerMicrosoft.Office.Interop.Excel.IRtdServer)。

  3. 然后可以使用IRtdServer.ConnectData(topicID, topics, newData)获取数据:

    • topicID似乎是任意的int
    • topics是您在Excel中使用的参数,它是一个数组
    • newData是一个bool,如果您请求新数据而不是缓存数据,请将其设置为True
  4. 但是,我相信如果想要自动更新数据,就需要一个回调事件。

根据the linked blog post,事件类也可以通过progID获得。但在注册表中找不到。

在C中,我认为可能创建一个IRTDUpdateEvent。但我不知道如何用Python来处理它。

有人能帮我解决这些错误吗?


Tags: 模块函数in服务器comnone参数错误
2条回答

解决了。安装并使用32位ActivePython

http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html

可能是因为我正在使用64位python并试图获取32位com对象

附则

pyrtd模块只支持单主题订阅。

用户只需对pyrtd.py稍加修改即可传递元组以启用多个主题子:

第116行

self._rtd.ConnectData(id, list(topic), True)

相关问题 更多 >