dispinterface 属性
dispinterface ステートメントは、IDispatch::Invoke を呼び出すことができるプロパティとメソッドのセットを定義します。 dispinterface は、サポートされている一連のメソッドとプロパティ (構文 1) を明示的に一覧表示するか、単一のインターフェイス (構文 2) を一覧表示することによって定義できます。
[
[attributes]
]
dispinterface dispinterface-name
{
properties:
property-list
methods:
method-list
};
[
[attributes]
]
dispinterface dispinterface-name
{
interface interface-name
};
パラメーター
-
attributes
-
dispinterface 全体に適用される属性を指定します。 [helpstring]、[helpcontext]、[helpfile]、[hidden]、[nonextensible]、[oleautomation]、[restricted]、[uuid]、および [version] の各属性を使用できます。
-
dispinterface-name
-
タイプ ライブラリで dispinterface が認識される名前。 この名前はタイプ ライブラリ内で一意である必要があります。
-
property-list
-
(構文 1)変数の形式で宣言された、 オブジェクトでサポートされるプロパティの省略可能なリスト。 これは、メソッド の一覧でプロパティ関数を宣言するための短い形式です。 詳細については、「コメント」セクションを参照してください。
-
method-list
-
(構文 1) dispinterface の各メソッドとプロパティの関数プロトタイプを構成するリスト。 任意の数の関数定義を メタリストに表示できます。 メタリストの関数の形式は次のとおりです。
[属性]returntype メタ名 型 paramname(params);
dispinterface のメソッドでは、次の属性が受け入れられます: [helpstring]、[helpcontext]、[propget]、[propput]、[propputref]、[string]、および [vararg]。 [vararg] を指定する場合、最後のパラメーターは VARIANT 型の安全な配列である必要があります。
パラメーター リストはコンマ区切りのリストで、 の各要素の形式は次のとおりです。
[属性]
型には、任意の宣言型または組み込み型、または任意の型へのポインターを指定できます。 パラメーターの属性は次のとおりです。
-
interface-name
-
(構文 2)IDispatch インターフェイスとして宣言するインターフェイスの名前。
解説
MIDL コンパイラは、(左から右へ) 次のパラメーター順序を受け入れます。
- 必須パラメーター ([defaultvalue] 属性または [省略可能] 属性を持たないパラメーター)
- 省略可能なパラメーターと [defaultvalue] 属性の有無に関係なく、
- パラメーターに [省略可能] 属性を指定し、[defaultvalue] 属性を指定しない場合は、
- [ lcid] パラメーター (存在する場合)
- [ retval] パラメーター
メソッド関数は、 モジュール のリファレンス ページで説明されているとおりに指定されます。ただし、[ entry] 属性は許可されません。 STDOLE32 に注意してください。TLB (STDOLE。16 ビット システムの TLB) をインポートする必要があります。 dispinterface は IDispatch から継承されるためです。
プロパティまたはメソッド の一覧でプロパティを宣言できます。 プロパティ リストでプロパティを宣言しても、プロパティがサポートするアクセスの種類 (つまり、get、put、または putref) は示されません。 put または putref をサポートしていないプロパティには、[ readonly] 属性を指定します。 メソッドの一覧でプロパティ関数を宣言すると、1 つのプロパティの関数はすべて同じ識別子を持ちます。
最初の構文を使用して、プロパティ: タグとメソッド: タグが必要です。 [ id] 属性は、各メンバーにも必要です。 次に例を示します。
properties:
[id(0)] int Value; // Default property.
methods:
[id(1)] HRESULT Show();
インターフェイス メンバーとは異なり、dispinterface メンバーは、HRESULT エラー コードに加えて retval 属性を使用して値を返すことはできません。 IDispatch::Invoke は LCID を渡すので、[ lcid] 属性も dispinterfaces では同様に無効です。 ただし、これらの属性を使用するインターフェイスを再宣言することはできます。
2 つ目の構文を使用すると、IDispatch をサポートし、ODL スクリプトで以前に宣言されたインターフェイスは、次のように IDispatch インターフェイスとして再宣言できます。
dispinterface helloPro
{
interface hello;
};
前の例では、hello のすべてのメンバーと hello が継承するすべてのメンバーを IDispatch をサポートしていると宣言しています。 この場合、HRESULT を返した [lcid] メンバーと [retval] メンバーで hello が宣言されている場合、MkTypLib は各 [lcid] パラメーターと HRESULT 戻り値の型を削除し、代わりに戻り値の型を [retval] パラメーターの型としてマークします。
Note
Mktyplib.exe ツールは古くなっています。 代わりに MIDL コンパイラを使用してください。
dispinterface のプロパティとメソッドは、dispinterface の VTBL の一部ではありません。 したがって、 CreateStdDispatch と DispInvoke を使用して IDispatch::Invoke を実装することはできません。 dispinterface は、アプリケーションがオートメーションを介して既存の VTBL 以外の関数を公開する必要がある場合に使用されます。 これらのアプリケーションは、dispidMember パラメーターを調べて、対応する関数を直接呼び出すことによって、IDispatch::Invoke を実装できます。
例
[
uuid(1e196b20-1f3c-1069-996b-00dd010fe676),
version(1.0),
helpstring("Useful help string."),
helpcontext(2480)
]
dispinterface MyDispatchObject
{
properties:
[id(1)] int x; //An integer property named x
[id(2)] BSTR y; //A string property named y
methods:
[id(3)] HRESULT show(); //No arguments, no result
[id(11)] int computeit(int inarg, double *outarg);
};
[
uuid(1e123456-1f3c-1069-996b-00dd010fe676)
]
dispinterface MyObject
{
properties:
methods:
[id(1), propget, bindable, defaultbind, displaybind] long x();
[id(1), propput, bindable, defaultbind,
displaybind] HRESULT x(long rhs);
}
関連項目