我正在使用 Windows MMDevice API 枚举音频端点设备,我想在 GUI 中公开每个设备的音量控制。枚举后,我有一个列表 IMMDevice
, 谁的 Activate
我需要调用函数来获得 IAudioEndpointVolume
.
显然并非所有音频设备都实现该接口(interface)。如何正确检查设备是否实现了它?
这是我正在使用的代码:
// 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,这意味着:
Parameter ppInterface is NULL.
但是可以看到ppInterface
(调用Activate
的最后一个参数)不能为NULL。
在其他设备上我也得到FILE_NOT_FOUND。
在调用Activate
之前检查接口(interface)是否实现的正确方法是什么?理想情况下,我想区分接口(interface)缺失和需要单独错误处理(日志记录、UI 警告)的编程或 COM 错误。
最佳答案
根据 Activate()
文档,正确的错误代码是:
E_NOINTERFACE
The object does not support the requested interface type.
您的代码可以很好地请求 IAudioEndpointVolume
(前提是 pDevice
是一个有效指针),因此如果 E_POINTER
被返回,那么设备的Activate()
的实现有问题。
关于c++ - IMMDevice::Activate 缺少接口(interface)的返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48434265/