求VC++朋友们出手相助

wangjiuxing 2010-07-10 10:22:25
用 mciSendCommond(wDeviceID, MCI_PALY, 0, (DWORD)(LPVOID) &mciPlayParams);播放一个音频文件,那么这个设备到底是个什么东东呢?如果是硬件的那个所谓的设备,怎么知道就是我选择的那首歌呢?疑惑不解!
还有就是第四个参数为什么有两个(),是两次强制转换?
请友友们给详细讲解一下吧,在此先谢过各位了!
...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjiuxing 2010-07-10
  • 打赏
  • 举报
回复
也就是说在应用程序的代码里记录下打开的设备的ID, 当前打开的 设备 记录了文件的路径,在接收到关闭命令之前一直记录着这些信息?不知道是这样理解吗?
还有就是mciSendCommad最后的参数之前的两个()是两次强制转换?
精锐掷矛手 2010-07-10
  • 打赏
  • 举报
回复
我是这么理解的:
mciSendCommand的最后一个参数dwParam 就是一个command message。
而IDDevice接收command message。
当你Open的时候设备接收到OpenParams的信息,只要设备不再接受MCI_OPEN message,他会一直保存这个信息。
不知道是否表达清楚?
wangjiuxing 2010-07-10
  • 打赏
  • 举报
回复
DWORD CWave::Open()
{
Close ();
DWORD Openflag;
MCI_OPEN_PARMS OpenParams;
OpenParams.lpstrDeviceType = "waveaudio";
OpenParams.lpstrElementName = m_strPath; //播放文件路径
Openflag = mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ELEMENT
| MCI_OPEN_TYPE, (DWORD)(LPVOID) &OpenParams);
if(Openflag)
return Openflag;
Openflag = NULL;
m_wDeviceID = OpenParams.wDeviceID;
m_bOpen = TRUE;
MCI_SET_PARMS SetParams;
SetParams.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
Openflag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,
(DWORD)(LPVOID) &SetParams);
if(Openflag)
return Openflag;
return NULL;
}
DWORD CWave::Play ()
{
Stop ();
MCI_PLAY_PARMS PlayP;
mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
DWORD Playflag = mciSendCommand(m_wDeviceID, MCI_PLAY, ULL,
(DWORD)(LPVOID) &PlayP);
if(Playflag)
{
return Playflag;
}
else
{
m_bPlaying = TRUE;
return NULL;
}
}
OpenParams的生命周期只是在Open()里,Play()和Open()相同的只是设备的ID ,这个是我已经编好的一个程序的一部分代码,只是想弄弄清楚,谢谢你几次这么热情的回复!
精锐掷矛手 2010-07-10
  • 打赏
  • 举报
回复

MCI_OPEN_PARMS mciOP;
DWORD dwReturn;
ASSERT(m_wID==NULL);

mciOP.lpstrDeviceType=NULL;
mciOP.lpstrElementName=strPath;//播放文件路径
dwReturn=mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE,
(DWORD)(LPVOID)&mciOP);
if(dwReturn==0)
{
...
}else
...
精锐掷矛手 2010-07-10
  • 打赏
  • 举报
回复
你的这句代码

mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);

更改了媒体位置,应该是回到媒体开始位置。然后MCI_PLAY。
或许你之前已经发出MCI_OPEN命令,将播放的信息传进去了,然后MCI_PLAY。
wangjiuxing 2010-07-10
  • 打赏
  • 举报
回复
回复rebort_Q先生:

DWORD CWave::Play ()
{
Stop ();
MCI_PLAY_PARMS PlayP;
mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
DWORD Playflag = mciSendCommand(m_wDeviceID, MCI_PLAY,
NULL,(DWORD)(LPVOID) &PlayP);
if(Playflag)
{
return Playflag;
}
else
{
m_bPlaying = TRUE;
return NULL;
}
}
感觉不是您说的那样的,谢谢啊
精锐掷矛手 2010-07-10
  • 打赏
  • 举报
回复
设备指的是MCI设备,mciPlayParams参数中可以指定你选择的那首歌的路径。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧