Что не так с этой программой GetDefaultAudioEndpoint? - PullRequest
0 голосов
/ 19 марта 2012

Вот очень простая программа, использующая функцию:

#include <windows.h>
#include <tchar.h>
#include <atlstr.h>
#include <mmdeviceapi.h>
#include <devicetopology.h>
#include <functiondiscoverykeys.h>

#include <iostream>

using namespace std;

int main()
{
    HRESULT hr;
    CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
    pMMDeviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, 0);
    //cout << hr;
    return 0;
}

Когда я пытаюсь запустить это, я получаю следующую ошибку:

Debug Assertion Failed!

Program: ...
File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h
Line: 154

Expression: p!=0

Что с этим не так?Я только сейчас пытаюсь научиться использовать эту функцию.Спасибо!


РЕДАКТИРОВАТЬ:

Я изменил программу на это:

//#include <windows.h>
//#include <tchar.h>

#include <atlstr.h>
#include <mmdeviceapi.h>
//#include <devicetopology.h>
//#include <functiondiscoverykeys.h>

#include <iostream>

using namespace std;

// helper class to CoInitialize/CoUninitialize
class CCoInitialize {
private:
    HRESULT m_hr;
public:
    CCoInitialize(PVOID pReserved, HRESULT &hr)
        : m_hr(E_UNEXPECTED) { hr = m_hr = CoInitialize(pReserved); }
    ~CCoInitialize() { if (SUCCEEDED(m_hr)) { CoUninitialize(); } }
};

int main()
{


    CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
HRESULT hr = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
if (FAILED(hr)) {
    cout << "failed" << endl;
    return __LINE__;
    }

CCoInitialize ci(NULL, hr);
pMMDeviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, 0);
//cout << hr;
return 0;
}

Когда я запускаю ее, я получаю вывод «fail»,Что происходит?


РЕДАКТИРОВАТЬ:

Хорошо, теперь я достаточно изменил код, чтобы он работал без ошибок.т. е.

HRESULT hr = S_OK;  
cout << hr;
// initialize COM
CCoInitialize ci(NULL, hr);
if (FAILED(hr)) {
    cout << "failed1" << endl;
    return __LINE__;
}
cout << hr;
// get enumerator
CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator;
hr = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
if (FAILED(hr)) {
    cout << "failed2" << endl;
    return __LINE__;
}
cout << hr;
// get default render/capture endpoints
CComPtr<IMMDevice> pRenderEndpoint;
hr = pMMDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pRenderEndpoint);
if (FAILED(hr)) {
    cout << "failed3" << endl;
    return __LINE__;
}

cout << hr;
return 0;

Некоторые проблемы, с которыми я столкнулся ранее в этом примере (см. комментарии к ответам), были устранены путем удаления некоторого кода.Но когда я запускаю это новое тело функции main (), я получаю вывод «0000», что означает, что cout << hr всегда оценивается в «0».Это хорошо?Какую информацию я могу получить об устройстве по умолчанию сейчас?ч.и hr-> на самом деле не вызывать меню, так что я как бы в неведении.Спасибо!

1 Ответ

1 голос
/ 19 марта 2012
Переменная

pMMDeviceEnumerator содержит указатель, который равен NULL. Когда вы пытаетесь вызвать метод интерфейса для этого указателя, оператор -> проверяет это значение и выдает ошибку подтверждения.

Примеры Windows SDK показывают, как использовать эту функцию и API, проверьте их в: \ Samples \ multimedia \ audio, например, osd образец.

Этот пример представляет собой приложение на основе Win32, которое демонстрирует использование API-интерфейсов Vista для мониторинга устройства вывода звука по умолчанию и его текущая настройка громкости. Образец написан на C ++.

OSD не работает в более ранних версиях Windows, включая Windows XP, Windows 2000, Windows Me и Windows 98.

UPD: все, что нужно main, нужно для вызова API GetDefaultAudioEndpoint - Пример: узнать, установлены ли устройства воспроизведения звука по умолчанию и устройства захвата звука на одном оборудовании .

...