IMFSchemeHandler
COM公式ドキュメント
URL からメディアソースまたはバイトストリームを作成します。
解説(Remarks)
アプリケーションがこのインターフェイスを使用することはありません。このインターフェイスは、ソースリゾルバーが使用するスキームハンドラーによって公開されます。スキームハンドラーは、1 種類の URL スキームを解析するように設計されています。スキームハンドラーに URL が渡されると、その URL にあるリソースを解析し、メディアソースまたはバイトストリームのいずれかを作成します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
URL からオブジェクトを作成する非同期要求を開始します。ソースリゾルバーが URL からメディアソースを作成するとき、その要求をスキームハンドラーに渡します。
| pwszURL | LPWSTR | in | 解決する URL を含む null 終端文字列。 |
| dwFlags | DWORD | in | 1 つ以上のフラグのビットごとの OR。Source Resolver Flags を参照してください。 |
| pProps | IPropertyStore* | in | プロパティストアの IPropertyStore インターフェイスへのポインター。スキームハンドラーは、このプロパティストアを使用してオブジェクトを構成できます。このパラメーターは NULL にできます。詳細については、Configuring a Media Source を参照してください。 |
| ppIUnknownCancelCookie | IUnknown** | outoptional | IUnknown ポインターまたは値 NULL を受け取ります。値が NULL でない場合は、このポインターを IMFSchemeHandler::CancelObjectCreation メソッドに渡すことで、非同期操作を取り消すことができます。呼び出し元はこのインターフェイスを解放する必要があります。このパラメーターは NULL にでき、その場合、IUnknown ポインターは呼び出し元に返されません。 |
| pCallback | IMFAsyncCallback* | in | コールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元はこのインターフェイスを実装する必要があります。 |
| punkState | IUnknown* | in | 呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL にできます。このオブジェクトを使用して状態情報を保持できます。オブジェクトは、コールバックが呼び出されるときに呼び出し元に返されます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求されたアクセス (読み取りまたは書き込み) で URL を開けません。 | |
| サポートされていないバイトストリームの種類です。 |
解説(Remarks)
dwFlags パラメーターには、MF_RESOLUTION_MEDIASOURCE フラグまたは MF_RESOLUTION_BYTESTREAM フラグを含める必要があります。MF_RESOLUTION_MEDIASOURCE フラグが設定されている場合、スキームハンドラーは URL から直接メディアソースを作成することも、バイトストリームを作成することもあります。オブジェクトの種類は、IMFSchemeHandler::EndCreateObject メソッドの pObjectType パラメーターで返されます。スキームハンドラーがバイトストリームを返した場合、ソースリゾルバーはそのバイトストリームをバイトストリームハンドラーに渡し、バイトストリームハンドラーがそのバイトストリームからメディアソースを作成します。
MF_RESOLUTION_BYTESTREAM フラグが設定されている場合、スキームハンドラーは URL からバイトストリームの作成を試みます。ただし、スキームハンドラーがバイトストリームではなくメディアソースを直接作成するように設計されている場合、このメソッドは失敗します。
次の表は、これら 2 つのフラグをこのメソッドに渡したときの動作をまとめたものです。
| フラグ | 作成されるオブジェクト |
|---|---|
| MF_RESOLUTION_MEDIASOURCE | メディアソースまたはバイトストリーム |
| MF_RESOLUTION_BYTESTREAM | バイトストリーム |
MF_RESOLUTION_MEDIASOURCE フラグと MF_RESOLUTION_BYTESTREAM フラグは組み合わせることができますが、この場合は冗長です。
操作が完了すると、スキームハンドラーは IMFAsyncCallback::Invoke メソッドを呼び出します。Invoke メソッドは IMFSchemeHandler::EndCreateObject を呼び出して、作成されたオブジェクトへのポインターを取得する必要があります。
URL からオブジェクトを作成する非同期要求を完了します。(IMFSchemeHandler.EndCreateObject)
| pResult | IMFAsyncResult* | in | IMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが Invoke メソッドで受け取ったのと同じポインターを渡します。 |
| pObjectType | MF_OBJECT_TYPE* | out | 作成されたオブジェクトの種類を指定する MF_OBJECT_TYPE 列挙体のメンバーを受け取ります。 |
| ppObject | IUnknown** | out | オブジェクトの IUnknown インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 操作は取り消されました。 |
解説(Remarks)
このメソッドは IMFAsyncCallback::Invoke メソッドの内部から呼び出してください。
URL からオブジェクトを作成する現在の要求を取り消します。
| pIUnknownCancelCookie | IUnknown* | in | IMFSchemeHandler::BeginCreateObject メソッドの ppIUnknownCancelCookie パラメーターで返された IUnknown インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このメソッドを使用して、BeginCreateObject への以前の呼び出しを取り消すことができます。ただし、このメソッドは非同期であるため、操作を取り消す前に完了してしまう場合があります。したがって、このメソッドを呼び出した後でもコールバックが呼び出されることがあります。
BeginCreateObject が ppIUnknownCancelCookie パラメーターで NULL を返した場合、操作は取り消せません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFSchemeHandler "{6D4C7B74-52A0-4BB7-B0DB-55F29F47A668}" #usecom global IMFSchemeHandler IID_IMFSchemeHandler "{}" #comfunc global IMFSchemeHandler_BeginCreateObject 3 wstr,int,sptr,sptr,sptr,sptr #comfunc global IMFSchemeHandler_EndCreateObject 4 sptr,var,sptr #comfunc global IMFSchemeHandler_CancelObjectCreation 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFSchemeHandler "{6D4C7B74-52A0-4BB7-B0DB-55F29F47A668}" #usecom global IMFSchemeHandler IID_IMFSchemeHandler "{}" #comfunc global IMFSchemeHandler_BeginCreateObject 3 wstr,int,sptr,sptr,sptr,sptr #comfunc global IMFSchemeHandler_EndCreateObject 4 sptr,sptr,sptr #comfunc global IMFSchemeHandler_CancelObjectCreation 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。