我正在使用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 ,pVolume
是IAudioEndpointVolume
。但是,对于某些(但不是全部)已禁用的设备,它会返回 E_POINTER ,根据MSDN的含义:
参数ppInterface为NULL。
但是你可以看到ppInterface
(对Activate
的调用的最后一个参数)不能为NULL。
在其他设备上,我也会得到 FILE_NOT_FOUND 。
检查接口是否已实施的正确方法是什么?之前调用Activate
?理想情况下,我想区分缺少的接口和需要单独错误处理的编程或COM错误(日志记录,UI警告)。
答案 0 :(得分:1)
根据Activate()
文档,正确的错误代码为:
E_NOINTERFACE
该对象不支持所请求的接口类型。
您的代码可以用于请求IAudioEndpointVolume
(提供pDevice
是有效指针),因此如果返回E_POINTER
,则设备的Activate()
实现是错误的