Я пытаюсь получить торговые цены от поставщика данных под названием eSignal. Используя их примеры на странице разработчика (Ссылка), я могу легко воспроизвести функциональность в С#. К сожалению, провайдер не поддерживает разработчиков Python, и поэтому я пытаюсь сделать это самостоятельно, используя ссылку на объект com в их примерах. Однако я уже терплю неудачу в самом начале, так как не могу отправить рассматриваемый ком-объект.

Объект com предоставляется eSignal (WinSig.exe содержит данные объекта com), и я зарегистрировал его с помощью makepy (IESignal v.1.0.0):

C:\Python26\Lib\site-packages\win32com\client>python makepy.py
Generating to C:\Python26\lib\site-packages\win32com\gen_py\9C7CCB46-E9E8-4DDD-9784-4458877C2F10x0x1x0.py
Building definitions from type library...
Generating...
Importing module

Таким образом, файл модуля успешно сгенерирован. Затем я пытаюсь отправить его из python:

from win32com.client import Dispatch
from win32com.client.gencache import EnsureDispatch

CLSID = '{9C7CCB46-E9E8-4DDD-9784-4458877C2F10}'
print Dispatch(CLSID)

Однако это приводит к ошибке:

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

Это происходит для Dispatch, а также для SureDispatch. Я также просмотрел модуль, сгенерированный makepy, и попытался отправить каждый отдельный CLSID, предоставленный там, - безрезультатно.

Кто-нибудь знает, в чем может быть дело? Ваша помощь очень ценится!

Благодарность!

1
Muppet 5 Дек 2011 в 19:32

1 ответ

Вы уверены, что создаете экземпляр класса (но не интерфейса). Погуглив по uid {9C7CCB46-E9E8-4DDD-9784-4458877C2F10}, я получил ServerEsignal - и это похоже на интерфейс (IESignal)

1
Dewfy 5 Дек 2011 в 19:37
Спасибо за ответ. Да, я пробовал все разные CLSID, которые использовались в модуле, но, к сожалению, ничего не вышло. Я где-то читал, что мне может понадобиться IDispatch или что-то подобное???
 – 
Muppet
5 Дек 2011 в 21:08
IDispatch — это интерфейс, но вам нужен класс. Некоторые экземпляры классов могут реализовывать несколько интерфейсов. Итак, вам нужен экземпляр класса, и, начиная с него, вы уже можете извлечь ссылку на IDispatch.
 – 
Dewfy
5 Дек 2011 в 23:13