Pywin - 通过调用VariantInit()初始化pvarResult

时间:2011-03-28 08:35:49

标签: python com pywin32 bloomberg

我正在使用Pywin32通过其COM库与Bloomberg进行通信。这工作得相当好!但是,我已经指出了一个我认为非常复杂的问题。如果我将Com对象的QueueEvents属性设置为True,程序将失败。在文档中,他们有关于此的部分,

  

如果QueueEvents属性设置为   是的,你表现得很低级   实例化数据控件   使用C ++,然后在您的数据事件中   处理程序(调用)您将被要求   通过调用初始化pvarResult   VariantInit()函数。这将   阻止你的申请   收到重复的蜱虫。

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

我认为我理解这里的理论方面,你需要在comobject可以写入之前初始化数据结构。但是,你如何从Pywin32做到这一点?我对此一无所知,并希望了解如何做到这一点的任何想法或指示(!)。

以下提示均无效。我的程序没有抛出异常,它只是一次又一次地从COM对象返回相同的消息......

来自文档:

  

如果QueueEvents属性设置为   是的,你表现得很低级   实例化数据控件   使用C ++,然后在您的数据事件中   处理程序(调用)您将被要求   通过调用初始化pvarResult   VariantInit()函数。这将   阻止你的申请   收到重复的刻度。如果这   变量未设置数据   控制假定你没有   收到的数据,然后它会   试图重新发送它。 专业   容器,如MFC和Visual   基本的,这个标志会自动出现   由容器初始化。继续   请注意,这只适用于   应用程序,设置   QueueEvents属性为True。

1 个答案:

答案 0 :(得分:1)

我不确定这是否对您的问题有所帮助,但是要在Python中使用有效的COM事件,您不应该忘记:

  • 将COM公寓设为免费 在脚本的开头有线程 文件。这可以使用 以下几行

    import sys
    sys.coinit_flags = 0
    
  • 在调用第一个DispatchWithEvents

    之前为com库生成包装器
    from win32com.client.makepy import GenerateFromTypeLibSpec
    GenerateFromTypeLibSpec("ComLibName 1.0 Type Library")
    

如果您可以发布程序失败的方式(COM对象失败或者python拖出一些异常),也许我可以提供更多建议。