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 に設定するアプリケーションにのみ関係することに注意してください。