Windows 10上的媒体控制界面失败 我用Windows MCI(“媒体控制接口”)编写了一些基本的C++程序,特别是用于播放MIDI和MP3文件。他们过去在Windows XP上工作得很好。最近我转到了Windows10,现在它们有时可以工作(我不知道在什么情况下),但大多数情况下它们会立即终止,而不播放MP3或MIDI文件。奇怪的是,我没有得到错误指示(非零返回代码)。 我确保在所有相关通话中都包含MCI_等待选项。这些程序是命令行程序,不是图形程序。 请帮忙
好的,这是可读性更好的PLAYSIM(PLE)代码(对不起,我不经常使用stackoverflow)。 您会注意到主线非常基本。此实现中的设备类型是从文件类型推断出来的,文件类型总是工作得非常出色(错误或不受支持的文件类型会导致消息,而不是“静默故障”)。 我试图在开盘前先收盘,但这是不允许的。 我还寻找了某种类型的“MCI(重新)初始化调用”,但没有找到,而且以前从未需要过 --->>>有关更简单的版本,请参见结尾。该版本应可在任何Windows系统上“编译” 如何通知Microsoft修复此错误Windows 10上的媒体控制界面失败 我用Windows MCI(“媒体控制接口”)编写了一些基本的C++程序,特别是用于播放MIDI和MP3文件。他们过去在Windows XP上工作得很好。最近我转到了Windows10,现在它们有时可以工作(我不知道在什么情况下),但大多数情况下它们会立即终止,而不播放MP3或MIDI文件。奇怪的是,我没有得到错误指示(非零返回代码)。 我确保在所有相关通话中都包含MCI_等待选项。这些程序是命令行程序,不是图形程序。 请帮忙,windows,playback,mci,Windows,Playback,Mci,好的,这是可读性更好的PLAYSIM(PLE)代码(对不起,我不经常使用stackoverflow)。 您会注意到主线非常基本。此实现中的设备类型是从文件类型推断出来的,文件类型总是工作得非常出色(错误或不受支持的文件类型会导致消息,而不是“静默故障”)。 我试图在开盘前先收盘,但这是不允许的。 我还寻找了某种类型的“MCI(重新)初始化调用”,但没有找到,而且以前从未需要过 --->>>有关更简单的版本,请参见结尾。该版本应可在任何Windows系统上“编译” 如何通知Microsoft修复此
// ╔══════════════════════════════════════════════╗
// ║..............................................║
// ║.┌────┐.┌┐.....┌────┐.┌┐..┌┐.┌────┐.┌┐.┌────┐.║
// ║.│┌──┐│.││.....│┌──┐│.││..││.│┌───┘.││.│┌┐┌┐│.║
// ║.│└──┘│.││.....│└──┘│.│└──┘│.│└───┐.││.││││││.║
// ║.│┌───┘.││.....│┌──┐│.└─┐┌─┘.└───┐│.││.││└┘││.║
// ║.││.....│└───┐.││..││...││...┌───┘│.││.││..││.║
// ║.└┘.....└────┘.└┘..└┘...└┘...└────┘.└┘.└┘..└┘.║ Reinier Bakels
// ║..............................................║ 17 January 2016
// ╚══════════════════════════════════════════════╝
/*
\borland\bcc55\include\.h
\borland\bcc55\include\mmsystem.h
\borland\bcc55\include\winbase.h
*/
#define NAME_COMMANDS
#include "\rbb\boilerpl.h"
#include "\rbb\dis.h"
#include "\rbb\print.h"
#include "\rbb\ps.h"
#include "\rbb\gct.h" // getCurrentTime()
#include <windows>
#include <mmsystem>
#include <io>
#ifdef NAME_COMMANDS
const char * commandNames[] = {
"" , // 0x0800
"" , // 0x0801
"" , // 0x0802
"Open" , // 0x0803
"Close" , // 0x0804
"Escape" , // 0x0805
"Play" , // 0x0806
"Seek" , // 0x0807
"Stop" , // 0x0808
"Pause" , // 0x0809
"Info" , // 0x080A
"GetDevCaps" , // 0x080B
"Spin" , // 0x080C
"Set" , // 0x080D
"Step" , // 0x080E
"Record" , // 0x080F
"Sysinfo" , // 0x0810
"Break" , // 0x0811
"" , // 0x0812
"Save" , // 0x0813
"Status" // 0x0814
};
#endif
DWORD mci( MCIDEVICEID devID , UINT uCmd , void * parms , DWORD options = 0 )
{
DWORD rc ;
#ifdef NAME_COMMANDS
fputs( commandNames[ uCmd - DRV_MCI_FIRST ] , stdout ); putchar(' ');
#endif
if ( rc = mciSendCommand( devID , uCmd , options , (DWORD) parms )) {
disint( rc );
TCHAR errorMessage[MAXERRORLENGTH];
if ( mciGetErrorString( rc , errorMessage , sizeof errorMessage )) {
CharToOem( errorMessage , errorMessage );
puts( errorMessage );
} else {
puts( "(unknown)" );
} /* endif */
} else {
puts( "OK.");
} /* endif */
return rc ;
}
int main( int argc , char ** argv )
{
boilerPlate();
if ( argc < 2 ) { puts("no arg."); return 0 ; }
char * fileName = *++argv ; disstr( fileName ); if ( access( fileName ,0 )) { say(File does not exist); return 0 ; }
MCI_OPEN_PARMS openParms = {0};
MCI_PLAY_PARMS playParms = {0};
MCI_GENERIC_PARMS genericParms = {0}; // only contains dwCallback
openParms.lpstrElementName = fileName ;
mci(0, MCI_OPEN , & openParms , MCI_WAIT | MCI_OPEN_ELEMENT ); // MCI_OPEN_SHAREABLE not allowed!
MCIDEVICEID devID = openParms.wDeviceID ; if ( devID != 1 ) dishex( devID ); // don't know why, but it seems to be always one
__int64 before = getCurrentTime();
if (! mci( devID, MCI_PLAY , & playParms , MCI_WAIT ))
printf( "\tcompleted with zero return code in %G seconds.\n", 1e-7f * ( getCurrentTime() - before ));
mci( devID, MCI_CLOSE , & genericParms );
return 0 ;
}
//╔══════════════════════════════════════════════╗
// ║..............................................║
// ║.┌────┐.┌┐.....┌────┐.┌┐..┌┐.┌────┐.┌┐.┌────┐.║
// ║.│┌──┐│.││.....│┌──┐│.││..││.│┌───┘.││.│┌┐┌┐│.║
// ║.│└──┘│.││.....│└──┘│.│└──┘│.│└───┐.││.││││││.║
// ║.│┌───┘.││.....│┌──┐│.└─┐┌─┘.└───┐│.││.││└┘││.║
// ║.││.....│└───┐.││..││...││...┌───┘│.││.││..││.║
// ║.└┘.....└────┘.└┘..└┘...└┘...└────┘.└┘.└┘..└┘.║ 雷尼尔·巴克尔
// ║..............................................║ 2016年1月17日
// ╚══════════════════════════════════════════════╝
/*
\borland\bcc55\include\.h
\borland\bcc55\include\mmsystem.h
\borland\bcc55\include\winbase.h
*/
#定义NAME\u命令
#包括“\rbb\boilerpl.h”
#包括“\rbb\dis.h”
#包括“\rbb\print.h”
#包括“\rbb\ps.h”
#包括“\rbb\gct.h”//getCurrentTime()
#包括
#包括
#包括
#ifdef NAME_命令
常量字符*命令名[]={
“”,//0x0800
“”,//0x0801
“”,//0x0802
“打开”//0x0803
“关闭”//0x0804
“Escape”,//0x0805
“播放”//0x0806
“Seek”,//0x0807
“停止”//0x0808
“暂停”,//0x0809
“Info”,//0x080A
“GetDevCaps”,//0x080B
“自旋”//0x080C
“设置”//0x080D
“步骤”//0x080E
“记录”//0x080F
“Sysinfo”,//0x0810
“Break”//0x0811
“”,//0x0812
“保存”//0x0813
“状态”//0x0814
};
#恩迪夫
DWORD mci(MCIDEVICEID设备,UINT uCmd,无效*参数,DWORD选项=0)
{
德沃德;
#ifdef NAME_命令
FPUT(命令名[uCmd-DRV_MCI_FIRST],标准输出);putchar(“”);
#恩迪夫
if(rc=mciSendCommand(设备、uCmd、选项、(DWORD)参数)){
迪斯特(rc);
TCHAR errorMessage[MAXERRORLENGTH];
if(mciGetErrorString(rc、errorMessage、sizeof errorMessage)){
图表(错误信息,错误信息);
puts(错误消息);
}否则{
看跌期权(“(未知)”);
}/*endif*/
}否则{
放置(“OK”);
}/*endif*/
返回rc;
}
int main(int argc,字符**argv)
{
样板文件();
if(argc<2){put(“no arg.”);返回0;}
char*fileName=*++argv;disstr(文件名);if(访问(文件名,0)){say(文件不存在);返回0;}
MCI_OPEN_PARMS openParms={0};
MCI_PLAY_PARMS PLAY PARMS={0};
MCI_GENERIC_PARMS genericParms={0};//仅包含dwCallback
openParms.lpstrElementName=文件名;
mci(0,mci_OPEN,&openParms,mci_WAIT | mci_OPEN_元素);//不允许mci_OPEN_共享!
MCIDEVICEID devID=openParms.wDeviceID;if(devID!=1)dishex(devID);//不知道为什么,但似乎总是这样
__int64 before=getCurrentTime();
如果(!mci(设备、mci_播放和播放参数、mci_等待))
printf(“\t在%G秒内完成零返回码。\n”,1e-7f*(getCurrentTime()-before));
mci(设备、mci_关闭和一般参数);
返回0;
}
更简单的是:
// PLAYSIM even more simplified
#include <stdio>
#include <windows>
#include <mmsystem>
#include <io>
DWORD mci( const char * commandName , MCIDEVICEID devID , UINT uCmd , void * parms , DWORD options = 0 )
{
DWORD rc = mciSendCommand( devID , uCmd , options , (DWORD) parms );
fputs( commandName , stdout ); puts( rc ? " failed." : " OK." );
return rc ;
}
int main( int argc , char ** argv )
{
if ( argc < 2 ) { puts("no arg."); return 0 ; }
char * fileName = *++argv ; if ( access( fileName ,0 )) { puts( "File does not exist."); return 0 ; }
MCI_OPEN_PARMS openParms = {0};
MCI_PLAY_PARMS playParms = {0};
MCI_GENERIC_PARMS genericParms = {0}; // only contains dwCallback
openParms.lpstrElementName = fileName ;
mci( "Open ", 0 , MCI_OPEN , & openParms , MCI_WAIT | MCI_OPEN_ELEMENT );
mci( "Play " , openParms.wDeviceID , MCI_PLAY , & playParms , MCI_WAIT );
mci( "Close" , openParms.wDeviceID , MCI_CLOSE , & genericParms );
return 0 ;
}
//PLAYSIM更加简化
#包括
#包括
#包括
#包括
DWORD mci(常量字符*命令名,MCIDEVICEID设备,UINT uCmd,无效*参数,DWORD选项=0)
{
DWORD rc=mciSendCommand(设备、uCmd、选项、(DWORD)参数);
fputs(commandName,stdout);put(rc?“失败”):“确定”);
返回rc;
}
int main(int argc,字符**argv)
{
if(argc<2){put(“no arg.”);返回0;}
char*fileName=*++argv;if(access(fileName,0)){put(“文件不存在”);返回0;}
MCI_OPEN_PARMS openParms={0};
MCI_PLAY_PARMS PLAY PARMS={0};
MCI_GENERIC_PARMS genericParms={0};//仅包含dwCallback
openParms.lpstrElementName=文件名;
mci(“打开”,0,mci_打开,和openParms,mci_等待| mci_打开|元素);
mci(“Play”,openParms.wDeviceID,mci_Play,&playParms,mci_WAIT);
mci(“关闭”、openParms.wDeviceID、mci_Close和genericParms);
返回0;
}
您能显示您的代码吗?MCI\u OPEN\u PARMS ope