0

列挙されたオーディオ エンドポイントのエンドポイントとフレンドリ名を出力するために呼び出している次の関数があります。

void EPPrint(void)
{       
    HRESULT hr;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDeviceCollection *pCollection = NULL;
    IMMDevice *pEp = NULL;
    IPropertyStore *pProps =NULL;
    UINT count;
    PWSTR strID;
    PROPVARIANT pv;

    hr = CoCreateInstance(CLSID_MMDeviceEnumerator ,NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void **)&pEnumerator);
    hr = pEnumerator -> EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE,&pCollection);
    hr = pCollection ->GetCount(&count);
    if(count==0)
    {
    }
    for (ULONG i =0; i<count; ++i)
    {
        hr= pCollection->Item(i,&pEp);
        hr = pEp ->GetId(&strID);
        hr = pEp ->OpenPropertyStore(STGM_READ,&pProps);
        PropVariantInit(&pv);
        hr = pProps ->GetValue(PKEY_Device_FriendlyName, &pv);
        printf("Enpoint %d: \"%S\" (%S)\n",i,pv.pwszVal, strID);
    }
}

ただし、ランタイムエラーが発生していますUnhandled exception at 0x008e104a in EPAudioControl.exe: 0xC0000005: Access violation reading location 0x00000000.

行でプログラムを壊しhr = pEnumeartor -> ...ます。

プログラムを正しく実行するには、特別な Windows パーミッションが必要ですか?

4

1 に答える 1

0

pEnumerator が NULL ポインターであることが判明しました。CoCreateInstance呼び出しが pEnumerator を適切に満たしていませんでした。CoInitialize(NULL)これは、 CoCreateInstance の前に呼び出しが必要なためです。プログラムに呼び出しを入れるCoInitiliaze(NULL)と、エラーはなくなりました。

于 2013-03-15T16:54:14.610 に答える