Как обойти `pywintypes.com_error` с помощью pyrtd/pythoncom?
Я пытаюсь использовать модуль pyrtd для Python, чтобы получить информацию, которую можно получить в Excel через RTD.
Однако, когда я пытаюсь запустить пример скрипта Python, я получаю следующую ошибку:
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#:
- AC# клиент для серверов данных реального времени Excel (RTD)
- Excel RTD Client в C#
- http://bbs.csdn.net/topics/320252117
- RTD-серверы Excel: несколько тем в C#
Основная идея:
Получить тип класса сервера rtd из таблицы регистрации
ProgID
(например,RTDTime.RTD
Вы можете найти их вHKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD
, если вы уже использовали regsvr32 для регистрации DLL).В C# функция
Type.GetTypeFromProgID()
, Я полагаю, что есть такая же функция в модуле Pythonwin32com
,Приведите класс сервера к
IRtdServer
(Microsoft.Office.Interop.Excel.IRtdServer
).Тогда можно использовать
IRtdServer.ConnectData(topicID, topics, newData)
чтобы получить данные:topicID
кажется случайнымint
;topics
это параметры, которые вы использовали в Excel, это массив;newData
этоbool
установите это бытьTrue
если вы запрашиваете новые данные, а не кэшированные данные.
Тем не менее, я считаю, что если кто-то хочет автоматически обновлять данные, ему потребуется событие обратного вызова.
Согласно связанному сообщению в блоге, класс события также может быть получен progID
, Но я не нашел ни одного в таблице рег.
В C# я думаю, что возможно создать IRTDUpdateEvent
, Но я не знаю, как справиться с этим с Python.
Может ли кто-нибудь помочь мне обойти эти ошибки?
2 ответа
Решаемые. Установите и используйте 32-битный ActivePython
http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html
Возможно, потому что я использую 64-битный python и пытаюсь получить 32-битный com-объект
PS
Модуль pyrtd поддерживает только подписку на одну тему.
Пользователю нужно внести небольшие изменения в pyrtd.py, чтобы передать кортеж для включения нескольких подпрограмм:
Line116
self._rtd.ConnectData(id, list(topic), True)