IParseDisplayName
COM公式ドキュメント
表示可能な名前文字列を解析し、カスタム モニカー実装のためにモニカーへ変換します。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定された表示名を解析し、対応するモニカーを作成します。
| pbc | IBindCtx* | in | このバインド操作で使用するバインド コンテキストへのポインター。IBindCtx を参照してください。 |
| pszDisplayName | LPWSTR | in | 解析対象の表示名。 |
| pchEaten | DWORD* | out | 表示名のうち ppmkOut モニカーに対応する文字数を受け取る変数へのポインター。 |
| ppmkOut | IMoniker** | out | 生成されたモニカーへのインターフェイス ポインターを受け取る IMoniker ポインター変数へのポインター。エラーが発生した場合、実装は ppmkOut を NULL に設定します。ppmkOut が NULL 以外の場合、実装は AddRef を呼び出す必要があります。Release を呼び出すのは呼び出し元の責任です。 |
戻り値
このメソッドは、標準の戻り値 E_OUTOFMEMORY および E_UNEXPECTED に加えて、次の値を返すことができます。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| 表示名に構文エラーがあります。pszDisplayName をモニカーへ部分的にしか解決できなかったため、解析に失敗しました。この場合、*pchEaten にはモニカーのプレフィックスとして正常に解析された文字数が格納されます。パラメーター ppmkOut は NULL になります。 | |
| 表示名は、この名前空間内のコンポーネントを識別しません。 | |
| 1 つ以上のパラメーターが無効です。 |
解説(Remarks)
一般に、このメソッドは、構文的に有効でオブジェクトを表す pszDisplayName の最大のプレフィックスを消費し、それをモニカーへ変換する必要があります。
通常、このメソッドは MkParseDisplayName または MkParseDisplayNameEx によって呼び出されます。解析操作の最初の手順で、これらの関数は「@ProgID」または「ProgID」表記のいずれかで識別されるクラスのインスタンスから、IParseDisplayName インターフェイスを直接取得できます。後続の解析手順では、中間オブジェクト上のインターフェイスをクエリできます。
MkParseDisplayName および MkParseDisplayNameEx のメイン ループは、現在保持しているモニカー上で IMoniker インターフェイスの同等のメソッド、すなわち IMoniker::ParseDisplayName を呼び出すことで、次のモニカー部分を見つけます。この IMoniker::ParseDisplayName の呼び出しでは、MkParseDisplayName または MkParseDisplayNameEx 関数は pmkToLeft パラメーターに NULL を渡します。現在保持しているモニカーが汎用複合モニカーである場合、IMoniker::ParseDisplayName の呼び出しはその複合モニカーによって最後の部分へ転送され、その部分の左側にある複合モニカーのプレフィックスが pmkToLeft に渡されます。
一部のモニカー クラスは、特定の種類のオブジェクトのみを指定するように設計されているため、この解析を内部で処理できます。それ以外のクラスは、解析処理を完了するために、指定するオブジェクトへバインドする必要があります。通常どおり、これらのオブジェクトは IMoniker::ParseDisplayName によって解放されるべきではなく、代わりに IBindCtx::RegisterObjectBound を介して、または IBindCtx::GetRunningObjectTable の後に IRunningObjectTable::Register を呼び出してバインド コンテキストへ転送し、後で解放できるようにする必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IParseDisplayName "{0000011A-0000-0000-C000-000000000046}" #usecom global IParseDisplayName IID_IParseDisplayName "{}" #comfunc global IParseDisplayName_ParseDisplayName 3 sptr,wstr,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IParseDisplayName "{0000011A-0000-0000-C000-000000000046}" #usecom global IParseDisplayName IID_IParseDisplayName "{}" #comfunc global IParseDisplayName_ParseDisplayName 3 sptr,wstr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。