ITypeComp
COM公式ドキュメント
ITypeComp インターフェイスは、構造体やインターフェイスへのバインドおよびインスタンス化の際にコンパイラが必要とする情報へ高速にアクセスする手段を提供します。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
名前を型のメンバーにマッピングするか、型ライブラリに含まれるグローバル変数および関数をバインドします。
| szName | LPWSTR | in | バインドする名前。 |
| lHashVal | DWORD | in | LHashValOfNameSys によって計算された、名前のハッシュ値。 |
| wFlags | WORD | in | INVOKEKIND 列挙型で定義されているフラグの 1 つ以上。名前がメソッドとして参照されたかプロパティとして参照されたかを指定します。変数にバインドする場合は INVOKE_PROPERTYGET フラグを指定します。任意の種類のメンバーにバインドする場合は 0 を指定します。 |
| ppTInfo | ITypeInfo** | out | FUNCDESC または VARDESC が返された場合、ppTInfo はバインド先の項目を含む型記述へのポインターを指します。 |
| pDescKind | DESCKIND* | out | バインドされた名前が VARDESC、FUNCDESC、TYPECOMP のいずれであるかを示します。一致するものがなかった場合は DESCKIND_NONE になります。 |
| pBindPtr | BINDPTR* | out | バインド先の VARDESC、FUNCDESC、または ITypeComp インターフェイス。 |
戻り値
このメソッドは次のいずれかの値を返します。
| Return code | Description |
|---|---|
| 成功しました。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
型の変数やメソッドへのバインド、または型ライブラリ内のグローバル変数やメソッドへのバインドには Bind を使用します。返される DESCKIND ポインター pDescKind は、名前が VARDESC、FUNCDESC、ITypeComp インスタンスのいずれにバインドされたかを示します。返される pBindPtr は VARDESC、FUNCDESC、または ITypeComp を指します。
データメンバーまたはメソッドにバインドされた場合、ppTInfo はそのメソッドまたはデータメンバーを含む型記述を指します。
Bind が名前を入れ子のバインディングコンテキストにバインドする場合、pBindPtr に ITypeComp インスタンスへのポインターを返し、ppTInfo に null の型記述ポインターを返します。たとえば、モジュール (TKIND_MODULE)、列挙型 (TKIND_ENUM)、または coclass (TKIND_COCLASS) に対して型記述の名前が渡された場合、Bind はそのモジュール、列挙型、または coclass の型記述の ITypeComp インスタンスを返します。この機能は、Visual Basic のように、型記述のメンバーへの参照を型記述の名前で修飾できる言語をサポートします。たとえば、モジュール内の関数は modulename.functionname として参照できます。
Application オブジェクトとしてマークされた TKIND_ENUM、TKIND_MODULE、TKIND_COCLASS 型のメンバーは、モジュール名を指定せずに ITypeComp から直接バインドできます。coclass の ITypeComp は、その既定インターフェイスの ITypeComp に委譲されます。
ITypeComp、ITypeInfo、および ITypeInfo の他のメソッドと同様に、返されたオブジェクトインスタンスや構造体を解放するのは呼び出し側の責任です。VARDESC または FUNCDESC が返された場合、呼び出し側は返された型記述を使ってそれを削除し、型記述インスタンス自体を解放する必要があります。それ以外に ITypeComp インスタンスが返された場合は、呼び出し側がそれを解放する必要があります。
型ライブラリの Bind メソッドを呼び出し、Application オブジェクトクラス (TYPEFLAG_FAPPOBJECT フラグが設定されたクラス) のメンバー名を渡した場合には、特別な規則が適用されます。この場合、Bind は pDescKind に DESCKIND_IMPLICITAPPOBJ を、pBindPtr に Application オブジェクトを記述する VARDESC を、ppTInfo に Application オブジェクトクラスの ITypeInfo を返します。そのオブジェクトにバインドするには、ITypeInfo::GetTypeComp を呼び出して Application オブジェクトクラスの ITypeComp を取得し、最初に型ライブラリの ITypeComp に渡した名前で再度その Bind メソッドを呼び出す必要があります。
呼び出し側は、返された ITypeInfo ポインター (ppTInfo) を使用して、メンバーのアドレスを取得する必要があります。
型ライブラリに含まれる型記述にバインドします。
| szName | LPWSTR | in | バインドする名前。 |
| lHashVal | DWORD | in | LHashValOfName によって計算された、名前のハッシュ値。 |
| ppTInfo | ITypeInfo** | out | 名前がバインドされた型の ITypeInfo。 |
| ppTComp | ITypeComp** | out | ITypeComp 変数のアドレスなど、有効なポインターを渡します。 |
戻り値
このメソッドは次のいずれかの値を返します。
| Return code | Description |
|---|---|
| 成功しました。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
型名を、その型を記述する ITypeInfo にバインドするには、BindType 関数を使用します。この関数は、ITypeLib::GetTypeComp によって返される ITypeComp に対して呼び出され、そのライブラリ内で定義された型にバインドします。将来的には、入れ子の型へのバインドにも使用できる可能性があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITypeComp "{00020403-0000-0000-C000-000000000046}" #usecom global ITypeComp IID_ITypeComp "{}" #comfunc global ITypeComp_Bind 3 wstr,int,int,sptr,var,var #comfunc global ITypeComp_BindType 4 wstr,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITypeComp "{00020403-0000-0000-C000-000000000046}" #usecom global ITypeComp IID_ITypeComp "{}" #comfunc global ITypeComp_Bind 3 wstr,int,int,sptr,sptr,sptr #comfunc global ITypeComp_BindType 4 wstr,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。