【发布时间】:2019-07-15 12:30:47
【问题描述】:
我想在我的一个应用程序中使用DSound Audio Render,所以我用CoCreateInstance 加载它。根据my previous question,如果我没有安装音频硬件,CoCreateInstance 可以返回REGDB_E_CLASSNOTREG。但是,如果我第二次调用CoCreateInstance,我就没有相同的HRESULT。这是一个小例子(要重现它,您应该在 Windows 的设备管理器中禁用所有音频设备):
#include <iostream>
#include <strmif.h>
#include <uuids.h>
int main()
{
std::cout << "Start" << std::endl;
HRESULT hr = CoInitialize(NULL);
printf("CoInitialize = 0x%x\n", hr);
IBaseFilter* ptr = NULL;
hr = CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&ptr);
printf("CoCreateInstance = 0x%x\n", hr);
if(ptr)
ptr->Release();
hr = CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&ptr);
printf("CoCreateInstance = 0x%x\n", hr);
if(ptr)
ptr->Release();
CoUninitialize();
std::cout << "End" << std::endl;
std::cin.get();
}
我得到这个结果:
Start
CoInitialize = 0x0
CoCreateInstance = 0x80040154
CoCreateInstance = 0x80040256
End
第一个错误代码0x80040154 对应于REGDB_E_CLASSNOTREG,因此它与the answer 一致我在上一个问题中得到,但第二个错误代码0x80040256 对应于VFW_E_NO_AUDIO_HARDWARE。根据MSDN:
VFW_E_NO_AUDIO_HARDWARE
0x80040256无法播放音频流: 没有可用的音频硬件,或者该硬件不受支持。
那么为什么我第二次调用CoCreateInstance 时才出现有意义的错误?在第一次调用时我可以更改什么来出现此错误?
【问题讨论】:
-
你不应该覆盖 ptr 而不先释放它。您是否尝试在第二次调用 CoCreateInstance 之前添加 ptr->Release()?不确定它是否相关,因为我无法重现您的问题。
-
@SimonMourier 在这种情况下没用,因为发生错误时 ptr 为 NULL。但是,你是对的,它更安全。
-
@SimonMourier 要重现它,您应该在 Windows 的设备管理器中禁用所有音频设备。
-
它本来可以做得更好,但既然你不应该直接
CoCreateInstance这无论如何它都不是一个错误。我很确定设备枚举器的行为将是一致的并且如文档所述。
标签: c++ com directshow