IMMDevice ::激活缺失接口

时间:2018-01-25 01:26:29

标签: c++ windows audio com

我正在使用Windows MMDevice API枚举音频端点设备,我想在GUI中公开每个设备的音量控制。枚举后,我有一个IMMDevice列表,我需要调用Activate函数才能获得IAudioEndpointVolume

显然并非所有音频设备都实现该接口。如何正确检查设备是否实现了它?

这是我正在使用的代码:

// smart pointers from _com_ptr_t
_COM_SMARTPTR_TYPEDEF(IMMDevice, __uuidof(IMMDevice));
_COM_SMARTPTR_TYPEDEF(IAudioEndpointVolume, __uuidof(IAudioEndpointVolume));

IAudioEndpointVolumePtr pVolume;
HRESULT hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, reinterpret_cast<void**>(&pVolume));

但是hr中的返回码有点令人困惑。对于大多数设备,我得到 S_OK pVolumeIAudioEndpointVolume。但是,对于某些(但不是全部)已禁用的设备,它会返回 E_POINTER ,根据MSDN的含义:

  

参数ppInterface为NULL。

但是你可以看到ppInterface(对Activate的调用的最后一个参数)不能为NULL。

在其他设备上,我也会得到 FILE_NOT_FOUND

检查接口是否已实施的正确方法是什么?之前调用Activate?理想情况下,我想区分缺少的接口和需要单独错误处理的编程或COM错误(日志记录,UI警告)。

1 个答案:

答案 0 :(得分:1)

根据Activate()文档,正确的错误代码为:

  

E_NOINTERFACE
  该对象不支持所请求的接口类型。

您的代码可以用于请求IAudioEndpointVolume(提供pDevice是有效指针),因此如果返回E_POINTER,则设备的Activate()实现是错误的