windows系统音量控制,API函数调用出错,该怎么处理

windows系统音量控制,API函数调用出错
最近在开发一个项目过程中遇到一些问题,问题具体如下:
项目中我需要控制系统音量,也就是麦克风以及扬声器音量,于是我找到了一个CVolume类,代码如下:

//Volume.h
include "MMSystem.h"
define HMIXER_NUM_MAX 10
class CVolume
{
public:
CVolume(void);
public:
~CVolume(void);

public:
HMIXER m_hMixer[HMIXER_NUM_MAX];
BOOL m_barrOpened[HMIXER_NUM_MAX];
HMIXER m_hMixerMic;
HMIXER m_hMixerSpk;
int m_iMixerNums;
MIXERLINE m_MixerLineMicrophone;

BOOL MixerOpen();
void MixerClose();
BOOL m_bIsOpen;
BOOL GetMicrophoneID();
BOOL GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetMicrophoneLevel(DWORD dwLevel);
BOOL GetSpeakerLevel(DWORD* dwLevel, DWORD* dwLevelMax);
BOOL SetSpeakerLevel(DWORD dwLevel);

};
//Volume.cpp
include "stdafx.h"
include "Volume.h"
CVolume::CVolume(void)
{
m_bIsOpen = FALSE;
m_iMixerNums = 0;
m_hMixerMic = 0;
m_hMixerSpk = 0;
for (int i = 0; i < HMIXER_NUM_MAX; i ++)
m_barrOpened[i] = FALSE;
}

CVolume::~CVolume(void)
{
MixerClose();
}

BOOL CVolume::MixerOpen()
{
m_iMixerNums = mixerGetNumDevs();
if (mixerGetNumDevs() < 1)
return FALSE;
m_iMixerNums = min(m_iMixerNums, HMIXER_NUM_MAX);
m_bIsOpen = FALSE;
for (int i = 0; i < m_iMixerNums; i ++)
{
MMRESULT mmresult = mixerOpen(&m_hMixer[i], (UINT)i, 0, 0, MIXER_OBJECTF_MIXER);

if (mmresult == MMSYSERR_NOERROR)
{
m_barrOpened[i] = TRUE;
m_bIsOpen = TRUE;
}
}
return m_bIsOpen;
}

void CVolume::MixerClose()
{
if (m_bIsOpen)
{
for (int i = 0; i < m_iMixerNums; i ++)
{
if (m_barrOpened[i])
{
mixerClose(m_hMixer[i]);
m_barrOpened[i] = FALSE;
}
}
m_bIsOpen = FALSE;
}
}

BOOL CVolume::GetMicrophoneID()
{
MMRESULT mmresult;
if (!m_bIsOpen)
return FALSE;
m_MixerLineMicrophone.cbStruct = sizeof(m_MixerLineMicrophone);
m_MixerLineMicrophone.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
for (int i = 0; i < m_iMixerNums; i ++)
{
mmresult = mixerGetLineInfo((HMIXEROBJ)m_hMixer[i], &m_MixerLineMicrophone,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
if (mmresult == MMSYSERR_NOERROR)
{
m_hMixerMic = m_hMixer[i];
break;
}
}
if (m_hMixerMic == 0)
return FALSE;
DWORD dwConnections = m_MixerLineMicrophone.cConnections;
DWORD dwLineID = 0;
for (DWORD i = 0; i < dwConnections; i++)

{

m_MixerLineMicrophone.dwSource = i;

MMRESULT mr = mixerGetLineInfo((HMIXEROBJ)m_hMixerMic, &m_MixerLineMicrophone,

MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE);

if (mr != MMSYSERR_NOERROR)

{

break;

}

if (m_MixerLineMicrophone.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)

{

dwLineID = m_MixerLineMicrophone.dwLineID;

break;

}

}

if (dwLineID == 0)

{

return FALSE;


return TRUE;
}

BOOL CVolume::GetMicrophoneLevel(DWORD* dwLevel, DWORD* dwLevelMax)
{
MMRESULT mmresult;
MIXERCONTROL mxc;

MIXERLINECONTROLS mxlc;
if (!m_bIsOpen)
return FALSE;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);

mxlc.dwLineID = m_MixerLineMicrophone.dwLineID;

mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;

mxlc.cControls = 1;

mxlc.cbmxctrl = sizeof(MIXERCONTROL);

mxlc.pamxctrl = &mxc;

mmresult = mixerGetLineControls(

reinterpret_cast(m_hMixerMic),

&mxlc,

MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);

if (mmresult != MMSYSERR_NOERROR)

return FALSE;
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;

MIXERCONTROLDETAILS mxcd;

mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mxcd.dwControlID = mxc.dwControlID;

mxcd.cChannels = 1;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);

mxcd.paDetails = &mxcdVolume;

mmresult = mixerGetControlDetails(

reinterpret_cast(m_hMixerMic),

&mxcd,

MIXER_GETCONTROLDETAILSF_VALUE);

if (mmresult != MMSYSERR_NOERROR)

return FALSE;
*dwLevel = mxcdVolume.dwValue;
*dwLevelMax = mxc.Bounds.dwMaximum;
return TRUE;
}

BOOL CVolume::SetMicrophoneLevel(DWORD dwLevel)
{
MMRESULT mmresult;