我正在使用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。
答案 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拖出一些异常),也许我可以提供更多建议。