0

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

如果您的 QueueEvents 属性设置为 True 并且您正在使用 C++ 执行数据控件的低级实例化,那么在您的数据事件处理程序(调用)中,您将需要通过调用 VariantInit() 函数来初始化 pvarResult。这将防止您的应用程序收到重复的报价。

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 属性设置为 True 并且您正在使用 C++ 执行数据控件的低级实例化,那么在您的数据事件处理程序(调用)中,您将需要通过调用 VariantInit() 函数来初始化 pvarResult。这将防止您的应用程序收到重复的报价。如果未设置此变量,则数据控件假定您尚未收到数据,然后它将尝试重新发送它。在 MFC 和 Visual Basic 等主要容器中,该标志将由容器自动初始化。请记住,这仅适用于将 QueueEvents 属性设置为 True 的应用程序。

4

1 回答 1

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 引发一些异常),也许我可以提供更多建议。

于 2011-03-28T15:26:54.327 回答