CoCreateInstance ใน MMDevice API ส่งคืนรหัสข้อผิดพลาด 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