2009-06-30 14 views
5

私はインターフェイス定義(IDL)以下で、サードパーティ製のCOMサーバーにアクセスする必要があります。Python win32 com: 'out'パラメータを扱う方法は?

interface IDisplay : IDispatch 
{ 
    HRESULT getFramebuffer (
    [in] ULONG aScreenId, 
    [out] IFramebuffer * * aFramebuffer, 
    [out] LONG * aXOrigin, 
    [out] LONG * aYOrigin); 
}; 

あなたが見ることができるように、それは[アウト]パラメータmodificatorsを経由して3つの値を返します。どのようにpython win32 COM API経由でこれを処理するには?例えば、私は、オブジェクトを作成し、それからIDisplayを得る:

object = win32com.client.Dispatch("VirtualBox.VirtualBox") 
display = object.display 

それが動作するようdisplay.getFrameBuffer()を呼び出すためにどのように?私はさまざまな方法を試しましたが、2番目の引数([IFrameBufferの場合は[out])に常に「型不一致」があります。

答えて

8

これらはパラメータであるため、

Framebuffer, XOrigin, YOrigin = display.getFrameBuffer(ScreenId) 

ありPython Programming on Win32 Chapter 12 Advanced Python and COM

でいくつかの良いの参照であり、それらは構文は上記のようにする必要があることを示しています。彼らはまた、COMオブジェクトの MakePyを使用して言及:

MakePyを使用するための良いいくつかの理由があります(本からコピーされた)オートメーションオブジェクトへ

  • ザ・Pythonインタフェースがでサポートされているオブジェクトのために高速ですが、 MakePyモジュール

  • タイプライブラリで定義されている定数は、Pythonプログラムで使用できます。 COM定数については、この章の後半で詳しく説明します。

  • 高度なパラメータタイプをサポートすることができます。特に、BYREFとしてCOMによって宣言されたパラメータは、MakePyでサポートされているオブジェクトでのみ使用できます。この章の後半でパラメータを渡すことについて議論します。

+0

私はこれを試しましたが、パラメータの数が無効です。 COMサーバーが第三者である場合、MakePyの使用方法がわかりません。バイナリとしてシステムにインストールされ、COMサーバーを登録します。 APIを変更することは可能ですか? – grigoryvp

3

次のようにそれを呼び出す、makepyモジュールを使用します。

>>> import win32com.client.makepy as makepy 
>>> makepy.main() 

ウィンドウをタイプライブラリの一覧が開きます。 「Virtual Box Type Library」までスクロールして選択し、「OK」をクリックします。 Pythonモジュールが印刷される場所に作成されます(通常は%TEMP%\gen_py\2.x\)。

生成されるクラスはwin32com.client.Dispatchによって自動的に使用されますが、明示的に必要な場合は、win32com.client.gencacheモジュールの関数を使用してアクセスできます。

関連する問題