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 に答える