ITypeLib
COM公式ドキュメント
タイプライブラリ、すなわち一連のオブジェクトを記述するデータを表します。(ITypeLib)
解説(Remarks)
システムレジストリには、インストールされているすべてのタイプライブラリの一覧が格納されています。タイプライブラリの構成を次の図に示します。
:::image type="content" source="./images/oa03_10.Png" border="false" alt-text="インストールされたタイプライブラリがシステムレジストリに列挙される際の構成を示す図。":::
ITypeLib インターフェイスは、型情報のライブラリにアクセスするためのメソッドを提供します。このインターフェイスは以下をサポートします。
- 型情報に対する汎用的なコンテインメント。ITypeLib は、ライブラリに含まれる型情報の反復処理を可能にします。
- グローバル関数とデータ。タイプライブラリは、データや関数をエクスポートする一連のモジュール(.DLL)の記述を含むことができます。タイプライブラリは、エクスポートされたデータや関数への参照のコンパイルをサポートします。
- 全般情報。ライブラリのユーザーが読み取り可能な名前や、ライブラリ全体のヘルプなどが含まれます。
メソッド 10
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
タイプライブラリ内に存在する型情報の数を返します。
戻り値
タイプライブラリ内の型情報の数。
ライブラリ内の指定された型情報を取得します。
| index | DWORD | in | 返されるインターフェイスのインデックス。 |
| ppTInfo | ITypeInfo** | out | 成功した場合、ITypeInfo インターフェイスへのポインターのポインターを返します。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| index パラメーターが、0 から GetTypeInfoCount - 1 までの範囲外です。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
デュアルインターフェイスの場合、GetTypeInfo は TKIND_DISPATCH の型情報のみを返します。TKIND_INTERFACE の型情報を取得するには、TKIND_DISPATCH の型情報に対してインデックス -1 を指定して GetRefTypeOfImplType を呼び出します。その後、返された型情報のハンドルを GetRefTypeInfo に渡します。
例
次の例は、デュアルインターフェイスの TKIND_INTERFACE 型情報を取得します。
HRESULT hr;
hr = ptlib->GetTypeInfo((unsigned int) dwIndex, &ptypeinfoDisp);
if (FAILED(hr)) {
//free resources
return hr;
}
hr = ptypeinfoDisp->GetRefTypeOfImplType(-1, &phreftype);
if (FAILED(hr)) {
//free resources
return hr;
hr = ptypeinfoDisp->GetRefTypeInfo(phreftype, &ptypeinfoInt);
if (FAILED(hr)) {
//free resources
return hr;
//
型情報の種類を取得します。
| index | DWORD | in | タイプライブラリ内の型情報のインデックス。 |
| pTKind | TYPEKIND* | out | 型情報の TYPEKIND 列挙値。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| index パラメーターが、0 から GetTypeInfoCount - 1 までの範囲外です。 |
指定された GUID に対応する型情報を取得します。
| guid | GUID* | in | 型情報の GUID。 |
| ppTinfo | ITypeInfo** | out | ITypeInfo インターフェイス。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 指定された GUID を持つ型情報がライブラリ内に見つかりませんでした。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
ライブラリの属性を格納する構造体を取得します。
| ppTLibAttr | TLIBATTR** | out | ライブラリの属性。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
TLIBATTR 構造体が占有するメモリを解放するには、ITypeLib::ReleaseTLibAttr を使用します。
クライアントコンパイラが、ライブラリの型、変数、定数、およびグローバル関数にバインドできるようにします。
| ppTComp | ITypeComp** | out | この ITypeLib に対する ITypeComp インスタンス。クライアントコンパイラは、ITypeComp インターフェイスのメソッドを使用して、ITypeLib 内の型や、ITypeLib 内で定義されたグローバル関数、変数、定数にバインドします。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
返された TypeComp の Bind 関数は、グローバル関数、変数、定数、列挙値、および coclass メンバーにバインドします。Bind 関数は、TKIND_MODULE、TKIND_ENUM、TKIND_COCLASS の TYPEKIND 列挙の名前にもバインドします。これらの名前は、型情報内で定義された任意のグローバル名を隠蔽します。Application オブジェクトとしてマークされた TKIND_ENUM、TKIND_MODULE、TKIND_COCLASS 型のメンバーは、モジュール名を指定せずに ITypeComp から直接バインドできます。
ITypeComp::Bind および ITypeComp::BindType は、修飾されていない名前のみを受け付けます。ITypeLib::GetTypeComp は ITypeComp インターフェイスへのポインターを返し、これを使用してライブラリ内のグローバル要素にバインドします。一部の型(TKIND_ENUM、TKIND_MODULE、TKIND_COCLASS)の名前は、変数、関数、定数、および列挙子と名前空間を共有します。
メンバーを名前空間内の他の項目と区別するために修飾が必要な場合、目的のメンバーにバインドするために各修飾子ごとに GetTypeComp を順次呼び出すことができます。これにより、プログラミング言語のコンパイラは、修飾名でバインドできないメンバーであっても、モジュール、列挙型、および coclass のメンバーにアクセスできます。
ライブラリのドキュメント文字列、完全なヘルプファイル名とパス、およびヘルプファイル内のライブラリのヘルプトピックのコンテキスト識別子を取得します。
| index | INT | in | ドキュメントを返す対象の型情報のインデックス。index が -1 の場合、ライブラリ自体のドキュメントが返されます。 |
| pBstrName | LPWSTR* | outoptional | 指定された項目の名前。呼び出し側が項目名を必要としない場合、pBstrName は null にできます。 |
| pBstrDocString | LPWSTR* | outoptional | 指定された項目のドキュメント文字列。呼び出し側がドキュメント文字列を必要としない場合、pBstrDocString は null にできます。 |
| pdwHelpContext | DWORD* | out | 指定された項目に関連付けられたヘルプコンテキスト識別子(ID)。呼び出し側がヘルプコンテキスト ID を必要としない場合、pdwHelpContext は null にできます。 |
| pBstrHelpFile | LPWSTR* | outoptional | ヘルプファイルの完全修飾名。呼び出し側がヘルプファイル名を必要としない場合、pBstrHelpFile は null にできます。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
呼び出し側は、パラメーター pBstrName、pBstrDocString、および pBstrHelpFile を解放する必要があります。
渡された文字列が、ライブラリに記述された型またはメンバーの名前を含むかどうかを示します。
| szNameBuf | LPWSTR | inout | テストする文字列。このメソッドが成功した場合、szNameBuf はタイプライブラリ内で見つかった大文字小文字(表記)に一致するよう変更されます。 |
| lHashVal | DWORD | in | szNameBuf のハッシュ値。 |
| pfName | BOOL* | out | szNameBuf がタイプライブラリ内で見つかった場合は true、それ以外の場合は false。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
タイプライブラリ内で型情報の出現箇所を検索します。これは、タイプライブラリ内に名前が存在することを素早く確認するために使用できます。
| szNameBuf | LPWSTR | inout | 検索する名前。 |
| lHashVal | DWORD | in | 検索を高速化するためのハッシュ値。LHashValOfNameSys 関数によって計算されます。lHashVal = 0 の場合、値が計算されます。 |
| ppTInfo | ITypeInfo** | out | szNameBuf で指定された名前を含む型情報へのポインターの配列。このパラメーターを null にすることはできません。 |
| rgMemId | INT* | out | 見つかった項目の配列。rgMemId[i] は、ppTInfo[i] で指定された型情報にインデックスする MEMBERID です。このパラメーターを null にすることはできません。 |
| pcFound | WORD* | inout | 入力時には、検索するインスタンスの数を示します。たとえば、最初の出現箇所を見つけるには *pcFound = 1 として呼び出せます。1 つ見つかると検索は停止します。 出力時には、見つかったインスタンスの数を示します。*pcFound の入力値と出力値が同一である場合、その名前を含む型情報がさらに存在する可能性があります。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
*pcFound = n を渡すことは、ppTInfo および rgMemId 配列に n 個の (ptinfo, memid) ペアを格納するのに十分な領域があることを示します。szNameBuf 内の名前が ppTInfo[i] の型情報の名前である場合、この関数は rgMemId[i] に MEMBERID_NIL を返します。
GetLibAttr から元々取得した TLIBATTR を解放します。
| pTLibAttr | TLIBATTR* | in | 解放する TLIBATTR。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITypeLib "{00020402-0000-0000-C000-000000000046}" #usecom global ITypeLib IID_ITypeLib "{}" #comfunc global ITypeLib_GetTypeInfoCount 3 #comfunc global ITypeLib_GetTypeInfo 4 int,sptr #comfunc global ITypeLib_GetTypeInfoType 5 int,var #comfunc global ITypeLib_GetTypeInfoOfGuid 6 var,sptr #comfunc global ITypeLib_GetLibAttr 7 var #comfunc global ITypeLib_GetTypeComp 8 sptr #comfunc global ITypeLib_GetDocumentation 9 int,var,var,var,var #comfunc global ITypeLib_IsName 10 var,int,var #comfunc global ITypeLib_FindName 11 var,int,sptr,var,var #comfunc global ITypeLib_ReleaseTLibAttr 12 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITypeLib "{00020402-0000-0000-C000-000000000046}" #usecom global ITypeLib IID_ITypeLib "{}" #comfunc global ITypeLib_GetTypeInfoCount 3 #comfunc global ITypeLib_GetTypeInfo 4 int,sptr #comfunc global ITypeLib_GetTypeInfoType 5 int,sptr #comfunc global ITypeLib_GetTypeInfoOfGuid 6 sptr,sptr #comfunc global ITypeLib_GetLibAttr 7 sptr #comfunc global ITypeLib_GetTypeComp 8 sptr #comfunc global ITypeLib_GetDocumentation 9 int,sptr,sptr,sptr,sptr #comfunc global ITypeLib_IsName 10 sptr,int,sptr #comfunc global ITypeLib_FindName 11 sptr,int,sptr,sptr,sptr #comfunc global ITypeLib_ReleaseTLibAttr 12 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。