c++ - IMMDevice::Activate 缺少接口(interface)的返回代码

标签 c++ windows audio com

我正在使用 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/

相关文章:

c++ - 从 `cmd` 文件启动的进程创建进程

c++ - 负数或超大 STL 双端队列?

C++ 代码运行时缺少 header ,为什么?

C# Windows 窗体 : Looping through Dynamically created TextBoxes and checking to see if Text has changed

ios - 将来自麦克风的音频录制为 .wav 格式并使用 Xamarin.ios 中的 AudioUnit 进行播放

javascript - Web Audio API getFloatFrequencyData 函数将 Float32Array 参数数据设置为 -Infinity 值数组

c++ - clang::ast_type_traits::DynTypedNode::get() 无法推断模板参数 'T'

windows - 将正斜杠附加到文件中特定行的末尾

c# - 带有特殊字符的 SQLite 查询 (ščćž)

c# - 将 wav 文件转换为 8000Hz 16 位单声道 Wav