2013年6月9日日曜日

デバイスとフィルタの列挙

System Device Enumerator の使い方

win32コンソールアプリケーションを空で作る

#include <dshow.h>


void main(void)
{
 printf("コンソール表示開始\n");

 // COM ライブラリを初期化する。
 HRESULT hr = CoInitialize(NULL);
 if (FAILED(hr))
 {
  printf("COM ライブラリを初期化エラー");
  return;
 }

 // System Device Enumerator を作成する。
 //HRESULT hr;
 ICreateDevEnum *pSysDevEnum = NULL;
 hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
  IID_ICreateDevEnum, (void **)&pSysDevEnum);
 if (FAILED(hr)) {
  printf("System Device Enumerator を作成エラー");
  MessageBox(0,0,0,0);//コンソールウインドウを閉じないように
  return;
 }

 // ビデオ コンプレッサ カテゴリのクラス列挙子を取得する。
 IEnumMoniker *pEnumCat = NULL;
 hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);

 if (hr == S_OK) 
 {
  // モニカを列挙する。
  IMoniker *pMoniker = NULL;
  ULONG cFetched;
  while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
  {
   IPropertyBag *pPropBag;
   hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
   if (SUCCEEDED(hr))
   {
    // フィルタのフレンドリ名を取得するには、次の処理を行う。
    VARIANT varName;
    VariantInit(&varName);
    hr = pPropBag->Read(L"FriendlyName", &varName, 0);
    if (SUCCEEDED(hr))
    {
     // なんらかの方法で UI に名前を表示する。
     wprintf(L"%s\n", varName.bstrVal);
    }
    VariantClear(&varName);

    // フィルタのインスタンスを作成するには、次の処理を行う。
    IBaseFilter *pFilter;
    hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
     (void**)&pFilter);
    // ここでグラフにフィルタを追加する。
    // 後で忘れずに pFilter を解放すること。
    pPropBag->Release();
   }
   pMoniker->Release();
  }
  pEnumCat->Release();
 }

 pSysDevEnum->Release();

 MessageBox(0,0,TEXT("OK"),0);//コンソールウインドウを閉じないようにする

}



CLSID_VideoCompressorCategory は10個(私の環境の場合)
フィルタ カテゴリを変更する場合
フィルタ カテゴリ 一覧



0 件のコメント:

コメントを投稿