IDeviceTopology如何激活devicetopology.h的接口?

问题描述 投票:0回答:1

上下文:我正在尝试使用组件对象模型(COM)激活“devicetopology.h”的一些核心音频接口,例如IAudioLoudnessIAudioPeakMeter,我需要获取当前的音量峰值系统的音频,我相信已经编写了完成这项工作所需的大部分代码,但是在尝试使用 IPart::Activate 激活这些接口时遇到了麻烦。

问题: 在假定的激活后尝试访问 IAudioPeakMeter 接口时,我的控制台应用程序抛出错误“调试断言失败!”描述只是说“表达式:p!= 0”。在 Visual Studio 中,抛出异常,指出:“访问冲突读取位置 0x00000000”,深入查看内存告诉我变量

audio
的值为
0x00000000 <NULL>

其他信息:在尝试自己解决问题时,我在单独的环境中重写了整个代码,而不使用 CComPtr(接口智能指针类),它给我带来了类似的错误:“audio is nullptr”

#include <iostream>
#include <devicetopology.h>
#include <mmdeviceapi.h>
#include "atlbase.h"
#include "Functiondiscoverykeys_devpkey.h"
#include "main.h"

int main()
{
  HRESULT hr = S_OK;
  CoInitialize(NULL);

  CComPtr<IMMDeviceEnumerator> enumerator;
  hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
  if (SUCCEEDED(hr) == true)
  {
    CComPtr<IMMDeviceCollection> devices;
    hr = enumerator->EnumAudioEndpoints(EDataFlow::eRender, DEVICE_STATEMASK_ALL, &devices);
    if (SUCCEEDED(hr) == true)
    {
        UINT count = 0;
        devices->GetCount(&count);
        for (int i = 0; i < count; i++)
        {
            CComPtr<IMMDevice> device;
            hr = devices->Item(i, &device);
            if (SUCCEEDED(hr) == true)
            {
                CComPtr<IDeviceTopology> topology;
                hr = device->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&topology);
                if (SUCCEEDED(hr) == true)
                {
                    CComPtr<IConnector> connector;
                    hr = topology->GetConnector(0, &connector);
                    if (SUCCEEDED(hr) == true)
                    {
                        CComPtr<IConnector> connectedTo;
                        hr = connector->GetConnectedTo(&connectedTo);
                        if (SUCCEEDED(hr) == true)
                        {
                            CComPtr<IPart> part;
                            hr = connectedTo->QueryInterface(&part);
                            if (SUCCEEDED(hr) == true)
                            {
                                CComPtr<IAudioPeakMeter> audio;
                                hr = part->Activate(CLSCTX_INPROC_SERVER, __uuidof(IAudioPeakMeter), (void**)&audio);

                                UINT channels;
                                audio->GetChannelCount(&channels); // Causes reading violation
                            }
                        }
                    }
                }
            }
        }
    }
}

我是使用 COM 编程的新手,无法弄清楚如何从这一点继续前进,我尝试在谷歌上搜索该问题,并查看一些使用 DeviceTopology 中其他接口的示例,但无法修复到目前为止的问题。

提前致谢。

c++ windows com
1个回答
0
投票

我们有解决上述问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.