这是一个使用该功能的非常简单的程序:
#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;
}
当我运行它时,我得到“失败”的输出。发生了什么事?
编辑:
好吧,现在我已经改变了足够的代码,让它一直运行,没有任何失败。即,
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&lt;&lt; hr总是评估为“0”。这是一件好事吗?现在我可以获得有关默认设备的哪些信息?小时。和hr-&gt;没有真正提出任何菜单,所以我有点在黑暗中。谢谢!
答案 0 :(得分:1)
pMMDeviceEnumerator
变量包含一个指针NULL
。当您尝试在此指针上调用接口方法时,->
运算符会检查此null并发出断言失败。
Windows SDK示例显示了如何使用此功能和API,请在以下位置进行检查:\ Samples \ multimedia \ audio,例如: osd
示例。
此示例是基于Win32的应用程序,演示如何使用Vista API监视默认音频输出设备和 当前的音量设置。该示例使用C ++编写。
OSD在早期版本的Windows上运行而不是,包括Windows XP,Windows 2000,Windows Me和Windows 98。
UPD:main
中的内容需要访问GetDefaultAudioEndpoint
API调用 - Sample: find out if your default audio playback and audio capture devices are on the same hardware。