Как обойти `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#:

Основная идея:

  1. Получить тип класса сервера rtd из таблицы регистрации ProgID (например, RTDTime.RTD Вы можете найти их в HKEY_LOCAL_MACHINE\SOFTWARE\Classes\RTDTime.RTD, если вы уже использовали regsvr32 для регистрации DLL).

    В C# функция Type.GetTypeFromProgID(), Я полагаю, что есть такая же функция в модуле Python win32com,

  2. Приведите класс сервера к IRtdServer (Microsoft.Office.Interop.Excel.IRtdServer).

  3. Тогда можно использовать IRtdServer.ConnectData(topicID, topics, newData) чтобы получить данные:

    • topicID кажется случайным int;
    • topics это параметры, которые вы использовали в Excel, это массив;
    • newData это bool установите это быть True если вы запрашиваете новые данные, а не кэшированные данные.
  4. Тем не менее, я считаю, что если кто-то хочет автоматически обновлять данные, ему потребуется событие обратного вызова.

Согласно связанному сообщению в блоге, класс события также может быть получен 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)
Другие вопросы по тегам