如何使用pyrtd / pythoncom解决`pywintypes.com_error`?

时间:2014-08-07 11:58:31

标签: python pywin32 win32com rtd pythoncom

我正在尝试使用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的注册表中获取rtd服务器的类类型(例如,RTDTime.RTD,如果您已经使用过HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD中找到它们> regsvr32 注册dll)。

    在C#中,函数为Type.GetTypeFromProgID()我相信Python模块win32com 中有相同的功能。

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

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

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

  5. 根据the linked blog post,事件类也可以通过progID获得。 但我没有在注册表中找到任何内容

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

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

2 个答案:

答案 0 :(得分:2)

解决。安装并使用32位ActivePython

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

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

答案 1 :(得分:0)

P.S。

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

用户需要对pyrtd.py进行少许修改以传递元组以启用多个主题sub:

Line116

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