2016-04-16 64 views
2

我想接口IBaseFilter系統混音器,但得到一個錯誤 REGDB_E_CLASSNOTREG類在未註冊​​:IMMDevice ::激活()的返回IBaseFilter REGDB_E_CLASSNOTREG類沒有註冊

hr = pEndpoint->Activate(__uuidof(IBaseFilter), CLSCTX_ALL, /*&var*/ NULL, (void**)ppFilter); 

早些時候此代碼工作。

全碼:

FILTERNAME = 「立體聲混音器(IDT高清晰度音頻編解碼器)」

HRESULT CCapture::GetAudioCaptureFilterByName(wstring *filterName, IBaseFilter **ppFilter) 
{ 
    HRESULT hr = S_OK; 
    IMMDeviceEnumerator *pEnumerator = 0; 
    IMMDeviceCollection *pCollection = 0; 
    IMMDevice *pEndpoint = 0; 
    IPropertyStore *pProps = 0; 
    LPWSTR pwszID = 0; 

    hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); 
    if (FAILED(hr)) return hr; 

    hr = pEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &pCollection); 
    if (FAILED(hr)) 
    { 
     if (pEnumerator) pEnumerator->Release(); 
     return hr; 
    } 

    UINT count; 
    hr = pCollection->GetCount(&count); 
    if (FAILED(hr)) 
    { 
     if (pCollection) pCollection->Release(); 
     if (pEnumerator) pEnumerator->Release(); 
     return hr; 
    } 

    if (count == 0) 
    { 
     if (pCollection) pCollection->Release(); 
     if (pEnumerator) pEnumerator->Release(); 
     return hr; 
    } 

    for (ULONG i = 0; i < count; i++) 
    { 
     hr = pCollection->Item(i, &pEndpoint); 
     if (FAILED(hr)) 
     { 
      if (pCollection) pCollection->Release(); 
      if (pEnumerator) pEnumerator->Release(); 
      return hr; 
     } 

     // Получаем ID устройства. 
     hr = pEndpoint->GetId(&pwszID); 
     if (FAILED(hr)) 
     { 
      if (pEndpoint) pEndpoint->Release(); 
      if (pCollection) pCollection->Release(); 
      if (pEnumerator) pEnumerator->Release(); 
      return hr; 
     } 

     hr = pEndpoint->OpenPropertyStore(STGM_READ, &pProps); 
     if (FAILED(hr)) 
     { 
      CoTaskMemFree(pwszID); 
      if (pEndpoint) pEndpoint->Release(); 
      if (pCollection) pCollection->Release(); 
      if (pEnumerator) pEnumerator->Release(); 
      return hr; 
     } 

     PROPVARIANT varName; 
     PropVariantInit(&varName); 

     // Получаем дружественное имя устройства. 
     hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName); 
     if (FAILED(hr)) 
     { 
      CoTaskMemFree(pwszID); 
      if (pProps) pProps->Release(); 
      if (pEndpoint) pEndpoint->Release(); 
      if (pCollection) pCollection->Release(); 
      if (pEnumerator) pEnumerator->Release(); 
      return hr; 
     } 


     wstring *wstr = new wstring(varName.pwszVal); 
     if (wstr->compare(*filterName) == 0) 
     { 
      DIRECTX_AUDIO_ACTIVATION_PARAMS daap; 
      daap.cbDirectXAudioActivationParams = sizeof(daap); 
      daap.guidAudioSession = guidAudioSessionId; 
      daap.dwAudioStreamFlags = AUDCLNT_STREAMFLAGS_CROSSPROCESS; 

      PROPVARIANT var; 
      PropVariantInit(&var); 

      var.vt = VT_BLOB; 
      var.blob.cbSize = sizeof(daap); 
      var.blob.pBlobData = (BYTE*)&daap; 

      hr = pEndpoint->Activate(__uuidof(IBaseFilter), CLSCTX_ALL, /*&var*/ NULL, (void**)ppFilter); 

      delete wstr; 
      CoTaskMemFree(pwszID); 
      PropVariantClear(&varName); 

      if (pProps) pProps->Release(); 
      if (pEndpoint) pEndpoint->Release(); 
      if (pCollection) pCollection->Release(); 
      if (pEnumerator) pEnumerator->Release(); 

      return hr; 
     } 

     delete wstr; 
     CoTaskMemFree(pwszID); 
     pwszID = NULL; 
     PropVariantClear(&varName); 
     if (pProps) pProps->Release(); 
     if (pEndpoint) pEndpoint->Release(); 
     pProps = 0; 
     pEndpoint = 0; 
    } 

    hr = E_FAIL; 
    if (pProps) pProps->Release(); 
    if (pEndpoint) pEndpoint->Release(); 
    if (pCollection) pCollection->Release(); 
    if (pEnumerator) pEnumerator->Release(); 

    return hr; 
} 

回答

2

問題是由安裝DirectShowSpy工具衝突引起的。

MMDevice的ActivateIBaseFilter大概做了以下內容:IMMDeviceActivator由系統設備枚舉CLSID_SystemDeviceEnum

if(interface is IBaseFilter) 
{ 
    IMMDeviceActivator pMmDeviceActivator; 
    CoCreateInstace(CLSID_SystemDeviceEnum, ..., &pMmDeviceActivator); 
    return pMmDeviceActivator->Activate(pMmDevice, ...) 
} 

實施無證(接口僅供內部使用)和DirectShowSpy沒有處理得很好。從版本1.0.0.2106開始它是正確的。

+0

羅馬,謝謝。 –