IMetaDataDispenser
COM公式ドキュメント
新しいメタデータスコープを作成するか、既存のスコープを開くためのメソッドを提供します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
新しいメタデータを作成できる、メモリ上の新しい領域を作成します。
| rclsid | GUID* | in | 作成するメタデータ構造のバージョンの CLSID。 |
| dwCreateFlags | DWORD | in | オプションを指定するフラグ。 |
| riid | GUID* | in | 返される目的のメタデータインターフェイスの IID。呼び出し元はこのインターフェイスを使用して新しいメタデータを作成します。 riid の値は「emit」インターフェイスのいずれかを指定する必要があります。有効な値は IID_IMetaDataEmit、IID_IMetaDataAssemblyEmit、または IID_IMetaDataEmit2 です。 |
| ppIUnk | IUnknown** | out | 返されるインターフェイスへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
DefineScope は、メモリ内のメタデータテーブルのセットを作成し、メタデータ用の一意の GUID(モジュールバージョン識別子、MVID)を生成し、生成対象のコンパイル単位についてモジュールテーブルにエントリを作成します。
ディスク上の既存のファイルを開き、そのメタデータを読み取り用にメモリへマップします。
| szScope | LPWSTR | in | 開くファイルの名前。ファイルには共通言語ランタイム(CLR)メタデータが含まれている必要があります。 |
| dwOpenFlags | DWORD | in | 開くモード(読み取りなど)を指定します。これは CorOpenFlags 列挙型の値です。ファイルからのインポート(読み取り)のみが可能で、ファイルへの生成(書き込み)はできません。 |
| riid | GUID* | in | 返される目的のメタデータインターフェイスの IID。呼び出し元はこのインターフェイスを使用してメタデータをインポート(読み取り)します。 riid の有効な値には IID_IUnknown、IID_IMetaDataImport、IID_IMetaDataImport2、IID_IMetaDataAssemblyImport、IID_IMetaDataTables、IID_IMetaDataTables2 が含まれます。 |
| ppIUnk | IUnknown** | out | 返されるインターフェイスへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
メモリ内のメタデータのコピーは、「import」インターフェイスのいずれかのメソッドを使用してクエリできます。対象のファイルに CLR メタデータが含まれていない場合、OpenScope メソッドは失敗します。
既存のメタデータを含むメモリ領域を開きます。つまり、このメソッドは、既存のデータをメタデータとして扱う指定されたメモリ領域を開きます。
| pData | void* | in | メモリ領域の開始アドレスを指定するポインター。 |
| cbData | DWORD | in | メモリ領域のサイズ(バイト単位)。 |
| dwOpenFlags | DWORD | in | 開くモード(読み取り、書き込みなど)を指定する CorOpenFlags 列挙型の値。 |
| riid | GUID* | in | 返される目的のメタデータインターフェイスの IID。呼び出し元はこのインターフェイスを使用してメタデータをインポート(読み取り)または生成(書き込み)します。 riid の値は「import」または「emit」インターフェイスのいずれかを指定する必要があります。有効な値は IID_IMetaDataEmit、IID_IMetaDataImport、IID_IMetaDataAssemblyEmit、IID_IMetaDataAssemblyImport、IID_IMetaDataEmit2、または IID_IMetaDataImport2 です。 |
| ppIUnk | IUnknown** | out | 返されるインターフェイスへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
メモリ内のメタデータのコピーは、「import」インターフェイスのいずれかのメソッドを使用してクエリしたり、「emit」インターフェイスのいずれかのメソッドを使用して追加したりできます。
OpenScopeOnMemory メソッドは OpenScope メソッドに似ていますが、対象のメタデータがディスク上のファイルではなくメモリ内に既に存在する点が異なります。
対象のメモリ領域に共通言語ランタイム(CLR)メタデータが含まれていない場合、OpenScopeOnMemory メソッドは失敗します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMetaDataDispenser "{809C652E-7396-11D2-9771-00A0C9B4D50C}" #usecom global IMetaDataDispenser IID_IMetaDataDispenser "{}" #comfunc global IMetaDataDispenser_DefineScope 3 var,int,var,sptr #comfunc global IMetaDataDispenser_OpenScope 4 wstr,int,var,sptr #comfunc global IMetaDataDispenser_OpenScopeOnMemory 5 sptr,int,int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMetaDataDispenser "{809C652E-7396-11D2-9771-00A0C9B4D50C}" #usecom global IMetaDataDispenser IID_IMetaDataDispenser "{}" #comfunc global IMetaDataDispenser_DefineScope 3 sptr,int,sptr,sptr #comfunc global IMetaDataDispenser_OpenScope 4 wstr,int,sptr,sptr #comfunc global IMetaDataDispenser_OpenScopeOnMemory 5 sptr,int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。