我使用以下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)
答案 0 :(得分:1)
我在其他地方找到了答案,所以我正在分享它。
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 Forums上找到答案。
重要的是值得注意的是mciSendString
如果你在路径中提供带空格的文件名(例如C:\ Program Files ...),它将会失败。即使你把它括在引号中它也无济于事。解决方案是使用GetShortPathName
Windows函数从NTFS路径名获取类似DOS的路径,并且其中没有空格。