上下文:我正在尝试使用组件对象模型(COM)激活“devicetopology.h”的一些核心音频接口,例如IAudioLoudness和IAudioPeakMeter,我需要获取当前的音量峰值系统的音频,我相信已经编写了完成这项工作所需的大部分代码,但是在尝试使用 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 中其他接口的示例,但无法修复到目前为止的问题。
提前致谢。
我们有解决上述问题吗?