VMR-7 フィルターの表示名を取得したい (CLSID_VideoMixingRenderer, {B87BEB7B-8D29-423f-AE4D-6582C10175AC}).
通常は を使用しCoCreateInstance (CLSID_SystemDeviceEnum) + CreateClassEnumerator (CLSID_ActiveMovieCategories)
、次にモニカー列挙を使用してフィルターのモニカーを見つけ、モニカーの GetDisplayName メソッドを使用します。これは、たとえば、「ビデオ レンダラー」の場合に機能します( CLSID_VideoRenderer, {70E102B0-5556-11CE-97C0-00AA0055595A})
--表示名を返します"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{70E102B0-5556-11CE-97C0-00AA0055595A}"
。
問題は、「Video Renderer」とは異なり、VMR-7 がどのカテゴリにも割り当てられていないことです。Windows XP では、CLSID_VideoMixingRenderer は、CLSID_LegacyAmFilterCategory のサブキーではなく、CLSID_ActiveMovieCategories のサブキーであるカテゴリのいずれにも含まれず、考えられる他のカテゴリにも含まれない個別のキーとしてのみレジストリに存在します。レジストリ内の他の CLSID にリンクされています。System Device Enumerator は、VMR-7 のモニカーを返しません。フィルター自体は存在し、機能します (実際、これは Windows XP の主要なビデオ レンダラーです)。使うことができます
CoCreateInstance (CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**) &VMR7IBaseFilterPointer);
VMR-7 を filtergraph に追加します。しかし、モニカを取得できない場合、どうすればその表示名を取得できますか? VMR-7のモニカを取得しようとしました
hr = VMR7IBaseFilterPointer -> QueryInterface (IID_IMoniker, (void**) &pim);
と
hr = VMR7IBaseFilterPointer -> QueryInterface (IID_IUnknown, (void**) &punk);
hr = punk -> QueryInterface (IID_IMoniker, (void**) &pim);,
IMoniker インターフェイスが実装されていないかのように、"No Interface" という応答が返されました。もう 1 つの質問は、モニカーを許可するフィルターが IMoniker インターフェイスも提供することになっているのではないかということです。