我使用下面的MP3播放一个mciSendString声音
mciSendString("play \"mysound.mp3\"", NULL, 0, 0);
上面的效果很好。但是根据我在网上看到的,人们对上面的代码使用各种各样的包装器。有些人首先发送open命令,然后是play,然后等待通知,然后发送close命令,他们也使用别名文件等。
我的问题是-所有这些都有必要吗?我的主要兴趣是播放一个文件,并以异步的方式完成它。上面的命令似乎完成了所有的清理,所以我的问题是-当声音被播放时,是否真的需要使用open或close命令和通知来正确释放内存和释放声音,这样做是否有好处。
从调试器中可以看到,在执行上述命令时,系统将加载所需的DLL,然后启动一些线程,在播放结束后,线程退出和DLL将被卸载。因此,我的猜测是,open/close是可选的,因为系统会自动完成所有的分配/取消分配,但我可能错了。我是否漏了一些内存或资源,如果我只是调用上面的行,而没有其他?
以下是调试日志显示的内容--我从这个日志中可以得出的结论是,线程已经关闭,DLL文件已经卸载:
Module Load: MCIQTZ32.dll. No Debug Info. Base Address: $61D80000. Process Project1.exe (368)
Thread Start: Thread ID: 492. Process Project1.exe (368)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $77920000. Process Project1.exe (368)
Module Unload: SETUPAPI.dll. Process Project1.exe (368)
Thread Start: Thread ID: 1344. Process Project1.exe (368)
Thread Start: Thread ID: 640. Process Project1.exe (368)
Thread Exit: Thread ID: 1344. Process Project1.exe (368)
Thread Exit: Thread ID: 640. Process Project1.exe (368)
Thread Start: Thread ID: 468. Process Project1.exe (368)
Thread Start: Thread ID: 1120. Process Project1.exe (368)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $77920000. Process Project1.exe (368)
Module Unload: SETUPAPI.dll. Process Project1.exe (368)
Thread Start: Thread ID: 1692. Process Project1.exe (368)
Thread Start: Thread ID: 1384. Process Project1.exe (368)
Thread Start: Thread ID: 204. Process Project1.exe (368)
Thread Start: Thread ID: 1572. Process Project1.exe (368)
Thread Exit: Thread ID: 1692. Process Project1.exe (368)
Thread Exit: Thread ID: 1384. Process Project1.exe (368)
Thread Exit: Thread ID: 1572. Process Project1.exe (368)
Thread Exit: Thread ID: 204. Process Project1.exe (368)
Thread Exit: Thread ID: 1120. Process Project1.exe (368)
Thread Exit: Thread ID: 468. Process Project1.exe (368)
Module Unload: MCIQTZ32.dll. Process Project1.exe (368)
Thread Exit: Thread ID: 492. Process Project1.exe (368)发布于 2014-01-26 19:05:05
我在其他地方找到了答案所以我分享了。
看来play命令本身是完全有效的。
这里有几种方法可以称之为:
// (a)
mciSendString("open waveaudio!MyFile.wav alias MyFile",NULL,0,0);
mciSendString("play MyFile wait",NULL,0,0);
mciSendString("close MyFile",NULL,0,0);
// (b)
mciSendString("open MyFile.wav alias MyFile",NULL,0,0);
mciSendString("play MyFile wait",NULL,0,0);
mciSendString("close MyFile",NULL,0,0);
// (c)
mciSendString("play MyFile.wav wait",NULL,0,0); // no open or alias used在MSDN论坛上找到答案。
值得注意的一件重要事情是,如果您为mciSendString提供路径中的空格(例如C:\Program .),那么它将不幸地失败。即使你把这个放在引号里,也不会有帮助的。解决方案是使用GetShortPathName窗口函数从NTFS名称中获得一个类似DOS的路径,该路径中没有空格。
https://stackoverflow.com/questions/21339248
复制相似问题