ページ 11

VC++ MCIのmciSendCommand関数について

Posted: 2012年12月12日(水) 00:14
by 神族
VC++でMCIのmciSendCommand関数使っても何故か音が出ないしエラーさえでない・・・誰か音楽再生仕方教えて下さい!

*コード変更しました2012/12/12/20:07

コード:

char buf[1000];
DWORD dwFlags=0;
MCI_OPEN_PARMS mop;

dwFlags|=MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID;
mop.lpstrDeviceType="Sequencer";

dwFlags|=MCI_OPEN_ELEMENT;
mop.lpstrElementName="test.Mid";

dwFlags|=MCI_WAIT;
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
	 mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
}else{
	 mciGetErrorString(ret,buf,sizeof(buf));
	 MessageBox::Show(gcnew String(buf),"error");
}
*追記:mciのエラーはこういう感じでました!「指定されたファイル名拡張子からデバイスの種類を判断できません。」だってお
*追記:lpstrDeviceTypeにMCI_DEVTYPE_SEQUENCER入れたら再生できたけど文字列指定だと何故か「指定されたファイル名拡張子からデバイスの種類を判断できません。」がでる。
ちなみにデフォルト再生はWindows Media
*追記:レジストエディターのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensionsでは、ちゃんと名前のMidとデータのSequencerが入ってます。

*自己解決:デバイスID使わないのに何故必要なのか?と思って

コード:

dwFlags|=MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID;
のMCI_OPEN_TYPE_ID;を消したら上手く文字列指定で再生できました!

Re: VC++ MCIのmciSendCommand関数について

Posted: 2012年12月12日(水) 01:07
by softya(ソフト屋)
こちらのサンプルコードのままでも動かないでしょうか?
http://www.geocities.jp/ky_webid/win32c/044.html

Re: VC++ MCIのmciSendCommand関数について

Posted: 2012年12月12日(水) 01:48
by YuO
それぞれの mciSendCommand API の戻り値,およびそれが 0 でなかった場合はそれを mciGetErrorString API に渡して得られた文字列はどうなっていますか。

コンパイルが通るのは第一段階で,それができてようやく「バグがないかどうかの調査」ができます。
ちゃんとテストやデバッグをしましょう。

Re: VC++ MCIのmciSendCommand関数について

Posted: 2012年12月12日(水) 21:57
by 神族
YuO さんが書きました:それぞれの mciSendCommand API の戻り値,およびそれが 0 でなかった場合はそれを mciGetErrorString API に渡して得られた文字列はどうなっていますか。

コンパイルが通るのは第一段階で,それができてようやく「バグがないかどうかの調査」ができます。
ちゃんとテストやデバッグをしましょう。

Re: VC++ MCIのmciSendCommand関数について

Posted: 2012年12月12日(水) 22:01
by softya(ソフト屋)
前にも書きましたが、次の返答が来てからの追記は読み飛ばしてしまうので書いたことに気づかないことが多いです。何よりメール通知が来ないのです。
今回は解決された様で良かったですが、次からは必ず返答の形にする事をオススメします。
「Win32APIと.NETの質問 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?t=1 ... 765#p96730