MMDevice 中的 CoCreateInstance API returns 错误代码 0x800401F0

CoCreateInstance in the MMDevice API returns error code 0x800401F0

如标题所示,我收到 CoCreateInstance 文档中没有的错误代码。具体错误码为0x800401F0.

注意:我是 C++ 的新手,一般来说是这个级别的编程。尝试通过构建音频可视化工具来学习。

#include <stdio.h>
#include <Mmdeviceapi.h>

int CALLBACK WinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR     lpCmdLine,
  int       nCmdShow
)
{
    const CLSID rclsid = __uuidof(MMDeviceEnumerator);
    const IID riid = __uuidof(IMMDeviceEnumerator);
    IMMDeviceEnumerator* pEnumerator;
    IMMDeviceCollection* pEndpoints;

    // Create a device enumerator
    HRESULT hr = CoCreateInstance(
        rclsid,
        NULL,
        CLSCTX_ALL,
        riid,
        reinterpret_cast<void **>(&pEnumerator)
    ); 
    if (FAILED(hr)) {
        printf("%x\n", hr);
    }
    // Create a collection of endpoints
    // pEnumerator->EnumAudioEndpoints(
    //  eCapture,
    //  DEVICE_STATE_ACTIVE,
    //  &pEndpoints
    // );

    // UINT deviceCount;
    // pEndpoints->GetCount(&deviceCount);
    // printf("%u\n", deviceCount);

    return 0;
}

编译 gcc audio.cpp -lole32

我是 运行 64 位机器。不确定这是否是问题的一部分。 有什么建议吗?

错误代码 0x800401F0 是 CO_E_NOTINITIALIZED ("CoInitialize has not been called")。这表明您没有先调用 CoInitialize()

也就是说,线程需要在调用 CoCreateInstance() 或任何其他 COM 调用之前调用 CoInitialize()(或 CoInitializeEx())。如果您需要优雅的清理,您应该释放 COM 接口指针,完成您的 COM activity,并在退出前调用 CoUninitialize()