Pywin - инициализировать pvarResult, вызывая VariantInit () - PullRequest
0 голосов
/ 28 марта 2011

Я использую Pywin32 для связи с Bloomberg через его COM-библиотеку.Это работает довольно хорошо!Однако я столкнулся с проблемой, которую считаю довольно сложной.Если установить для свойства QueueEvents объекта Com значение True I, программа завершится неудачно.В документации есть раздел, касающийся этого:

Если для вашего свойства QueueEvents установлено значение True и вы выполняете низкоуровневую реализацию элемента управления данными с помощью C ++, то в обработчике события данных (вызовите) вам потребуется инициализировать pvarResult, вызвав функцию VariantInit ().Это будет препятствовать тому, чтобы ваше приложение получало дубликаты тиков.

session = win32com.client.DispatchWithEvents(comobj, EventHandler)
session.QueueEvents = True   <--  this trigger some strange "bugs" in execution
                                  if "pvarResult" is not initialized

Я думаю, что я понимаю теоретические аспекты здесь, вам нужно инициализировать структуру данных, прежде чем комобъект сможет написать в нее.Тем не менее, как вы делаете это из Pywin32?Что я понятия не имею, и буду признателен за любые идеи или указания (!) О том, как это можно сделать.

Ни один из советов ниже не помог.Моя программа не выдает исключение, она просто возвращает одно и то же сообщение из COM-объекта снова и снова и снова ...

Из документации:

Если ваше свойство QueueEventsимеет значение True, и вы выполняете низкоуровневую реализацию элемента управления данными с помощью C ++, тогда в вашем обработчике событий данных (invoke) вам потребуется инициализировать pvarResult, вызвав функцию VariantInit ().Это помешает вашему приложению получать дубликаты.Если эта переменная не установлена, то элемент управления данными предполагает, что вы еще не получили данные, и затем попытается отправить его повторно. В основных контейнерах, таких как MFC и Visual Basic, этот флаг будет автоматически инициализироваться контейнером. Помните, что это относится только к приложениям, для которых для свойства QueueEvents установлено значение True.

1 Ответ

1 голос
/ 28 марта 2011

Я не уверен, поможет ли это вашей проблеме, но чтобы иметь рабочие события COM в Python, вы не должны забывать:

  • установка свободной квартиры COM с резьбой в начале скрипта файл. Это можно сделать с помощью следующие строки

    import sys
    sys.coinit_flags = 0
    
  • создание оболочки для библиотеки com перед вызовом первого DispatchWithEvents

    from win32com.client.makepy import GenerateFromTypeLibSpec
    GenerateFromTypeLibSpec("ComLibName 1.0 Type Library")
    

Если бы вы могли опубликовать, как происходит сбой программы (сбой COM-объекта или, возможно, Python генерирует некоторые исключения), возможно, я мог бы посоветовать больше.

...