CoCreateInstance в API MMDevice возвращает код ошибки 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-битную машину. Не уверен, что это может быть частью проблемы. Какие-либо предложения?


person Community    schedule 25.03.2018    source источник


Ответы (1)


Код ошибки 0x800401F0 — CO_E_NOTINITIALIZED ("CoInitialize не был вызван"). Это говорит о том, что вы не вызвали CoInitialize() первым.

То есть поток должен вызвать CoInitialize() (или CoInitializeEx()) перед вызовом CoCreateInstance() или любым другим COM-вызовом. Если вам нужна изящная очистка, вы должны освободить указатели COM-интерфейса, завершить свою COM-активность и вызвать CoUninitialize() перед выходом.

person Roman R.    schedule 25.03.2018