Windows 10上的媒体控制界面失败 我用Windows MCI(“媒体控制接口”)编写了一些基本的C++程序,特别是用于播放MIDI和MP3文件。他们过去在Windows XP上工作得很好。最近我转到了Windows10,现在它们有时可以工作(我不知道在什么情况下),但大多数情况下它们会立即终止,而不播放MP3或MIDI文件。奇怪的是,我没有得到错误指示(非零返回代码)。 我确保在所有相关通话中都包含MCI_等待选项。这些程序是命令行程序,不是图形程序。 请帮忙

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修复此

好的,这是可读性更好的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