IDispatchは、 OLE オートメーションプロトコルを公開するインターフェイスです。[1] IUnknownを拡張したもので、 COMオブジェクトによって公開できる標準インターフェイスの 1 つです。COM は、VTABLE ベースの IUnknown インターフェイスであるカスタム、イントロスペクションをサポートする IDispatch インターフェイスであるディスパッチ、および両方のタイプをサポートするデュアルインターフェイスの 3 つのインターフェイス タイプを区別します。
Automation (IDispatch) インターフェイスを使用すると、クライアント アプリケーションは実行時にオブジェクトでサポートされているプロパティとメソッドを検出できます。つまり、RTTIの概念を実装します。また、これらのプロパティとメソッドを呼び出すために必要な情報も提供します。クライアント アプリケーションは、コンパイル時にオブジェクト メンバーを認識する必要はありません。これにより、COM オブジェクトと ActiveX オブジェクトは、IISまたは IE が構築された時点では呼び出し規則が不明であったASPサーバーやInternet Explorer上のJavaScriptなどのスクリプト プログラム プラットフォームから呼び出すことができます。対照的に、単純なオブジェクト ライブラリはコンパイルされてプログラムにリンクされます。たとえば、DLL 呼び出しでは、コンパイル時に関数名とパラメーターを認識している必要があります。
スクリプト作成者は、COM オブジェクトに対して、ドキュメントから既にわかっているメソッドまたはプロパティを要求できます。次に、クライアントは、遅延バインディングの形式である IDispatch インターフェイスによって提供される Invoke を使用して関数を実行できます。この種の機能は、Dynamic Data Exchange (DDE) でもサポートされていましたが、レベルが低すぎるため、普及することはありませんでした。
ディスパッチインターフェースは柔軟性がありますが、カスタムインターフェースに比べて追加のイントロスペクションと呼び出しのオーバーヘッドが発生します。 [2]そのため、デュアルインターフェースを使用して両方のインターフェースタイプをサポートすることが推奨されます。これにより、VTABLEベースの呼び出しをサポートするクライアントは、ディスパッチインターフェースの代わりにカスタムインターフェースを使用できます。
方法
IDispatch インターフェイスをサポートするオブジェクトによって実装される各プロパティとメソッドには、いわゆる Dispatch ID があり、これは DISPID と略されることがよくあります。DISPID は、プロパティまたはメソッドを識別する主な手段であり、呼び出されるプロパティまたはメソッドの Invoke 関数に、パラメータを含む Variants の配列とともに指定する必要があります。GetIDsOfNames関数を使用すると、文字列形式のプロパティ名またはメソッド名から適切な DISPID を取得できます。
IDispatch はIUnknownから派生し、次の 4 つの追加メソッドで拡張されます。
インターフェイスIDispatch : public IUnknown {仮想HRESULT GetTypeInfoCount ( unsigned int * pctinfo ) = 0 ;仮想HRESULT GetTypeInfo ( unsigned int iTInfo 、LCID lcid 、ITypeInfo ** ppTInfo ) = 0 ;仮想HRESULT GetIDsOfNames ( REFIID riid 、OLECHAR ** rgszNames 、unsigned int cNames 、LCID lcid 、DISPID * rgDispId ) = 0 ; virtual HRESULT Invoke ( DISPID dispIdMember , REFIID riid , LCID lcid , WORD wFlags , DISPPARAMS * pDispParams , VARIANT * pVarResult , EXCEPINFO * pExcepInfo , unsigned int * puArgErr ) = 0 ; };
IDispatchインターフェイス ID は、 {00020400-0000-0000-C000-0000000000046} という値を持つ GUIDとして定義されます。
参考文献
- ^ Microsoft MSDN: IDispatch インターフェイス
- ^ Microsoft MSDN: ActiveX/COM Q&A 1995 年 12 月
外部リンク
- DispHelper は、C または C++ から IDispatch を使用するのに役立つオープンソースライブラリです。
