c++ - 为什么 CoCreateInstance 可以在完全相同的上下文中返回两个不同的 HRESULT?

标签 c++ com directshow

我想使用 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

Cannot play back the audio stream: no audio hardware is available, or the hardware is not supported.

那么,为什么只有在我第二次调用 CoCreateInstance 时才会出现有意义的错误?我可以更改什么以在第一次调用时出现此错误?

最佳答案

如果您想要记录在案且一致的行为,那么您不应该偷工减料并遵循建议的路线,这些路线是:Using the System Device Enumerator .

音频渲染器类别中的设备枚举将为您提供“默认 DirectSound 设备”的名字对象,然后您的 IMoniker::BindToObject 将产生有意义的 VFW_E_NO_AUDIO_HARDWARE(两者在第一次通话和随后的通话中)。

您也可以在不编写代码的情况下看到这一点:您可以使用 GraphStudioNext 应用程序、菜单 Graph、Insert Filter、组合框中的“Audio Renderers”类别,然后双击“Default DirectSound Device”条目尝试实例化过滤器。

至于关于不同代码的标语问题,这是我有根据的猜测。错误代码最终来自软件。您有机会看到系统中存在 COM 服务器,因此 COM 子系统确实开始实例化,然后在中间失败并将失败代码转发给您。 COM 服务器很可能具有单例或缓存的硬件枚举。在您的第一次尝试中,它在初始化期间遇到“无设备”条件并在较早的步骤中止实例化,因此 COM 报告无法创建实例。下一次服务器已经看到它的缓存枚举(也就是说,它不是你假设的“完全相同的上下文”)并跳过初始故障点,但随后再次遇到下一次检查。

对此您无能为力,尤其是您应该首先以不同方式实例化 CLSID_DSoundRender

关于c++ - 为什么 CoCreateInstance 可以在完全相同的上下文中返回两个不同的 HRESULT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54809694/

相关文章:

c++ - [Qt][Linux] 列出驱动器或分区

c++ - 未定义的 namespace 引用 - gsoap 错误

c++ - C++程序中的变量名存放在哪里?

windows - IE 网络浏览器控制资源 ://usage

c# - MSHTML HTMLHeadElementClass COM 错误

c++ - 在 CBaseRenderer 上实现帧步骤

c# - 如何在编译时驱动 C#、C++ 或 Java 编译器计算 1+2+3+...+1000?

c++ - COM Interop - 找不到成员

c++ - 如何用DirectShow写一个avi文件

c# DirectShow 示例显示黑屏,但声音正常