首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IMMDevice::Activate()使用IBaseFilter返回未注册的REGDB_E_CLASSNOTREG类

IMMDevice::Activate()使用IBaseFilter返回未注册的REGDB_E_CLASSNOTREG类
EN

Stack Overflow用户
提问于 2016-04-16 13:30:07
回答 1查看 586关注 0票数 2

我想获得接口IBaseFilter系统混频器,但得到一个错误的REGDB_E_CLASSNOTREG类没有注册:

代码语言:javascript
复制
hr = pEndpoint->Activate(__uuidof(IBaseFilter), CLSCTX_ALL, /*&var*/ NULL, (void**)ppFilter);

更早时,这段代码才能工作。

完全编码:

filterName =“立体混频器(IDT高清音频编解码器)”

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 11:24:12

该问题是由于与安装的DirectShowSpy工具冲突造成的。

MMDevice的Activate for IBaseFilter大概做了以下工作:

代码语言:javascript
复制
if(interface is IBaseFilter)
{
  IMMDeviceActivator pMmDeviceActivator;
  CoCreateInstace(CLSID_SystemDeviceEnum, ..., &pMmDeviceActivator);
  return pMmDeviceActivator->Activate(pMmDevice, ...)
}

IMMDeviceActivator的系统设备枚举器CLSID_SystemDeviceEnum的实现是没有文档的(接口保留给内部使用),DirectShowSpy没有很好地处理它。从1.0.0.2106版本开始,它就做对了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36664818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档