0

関数を使用した非常に単純なプログラムを次に示します。

#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 << hr が常に "0" に評価されることを意味します。これは良いことですか?現在、既定のデバイスについてどのような情報を取得できますか? 時間 と hr-> は実際にはメニューを表示しないので、私は暗闇の中にいます。ありがとう!

4

1 に答える 1

1

pMMDeviceEnumeratorvariable はポインタを保持します。これはNULLです。このポインターでインターフェイス メソッドを呼び出そうとすると、->オペレーターはこの null 性をチェックし、アサーション エラーを発行します。

Windows SDK サンプルは、この関数と API の使用方法を示しています。\Samples\multimedia\audio で確認してくださいosd

このサンプルは Win32 ベースのアプリケーションで、Vista API を使用して既定のオーディオ出力デバイスとその現在の音量設定を監視する方法を示しています。サンプルは C++ で記述されています。

OSD は、Windows XP、Windows 2000、Windows Me、Windows 98 など、以前のバージョンの Windows では動作しません。

UPD: API 呼び出しmainに到達する必要があるもの -サンプル: デフォルトのオーディオ再生デバイスとオーディオ キャプチャ デバイスが同じハードウェア上にあるかどうかを調べますGetDefaultAudioEndpoint

于 2012-03-19T14:04:45.170 に答える