我使用以下播放 MP3 声音mciSendString
mciSendString("play \"mysound.mp3\"", NULL, 0, 0);
以上工作正常。但从我在网上看到的情况来看,人们对上述代码使用了各种包装器。一些先发送open
命令play
,然后等待通知,然后发送close
命令,他们还使用文件别名等。
我的问题是——这一切有必要吗?我的主要兴趣只是播放文件并以异步方式进行。上面的命令似乎完成了所有的清理工作,所以我的问题是 - 是否真的需要在播放声音时使用open
或close
命令和通知以正确释放内存和解除分配声音,这样做有好处吗?
从我在调试器中可以看到,在执行上述命令时,系统会加载所需的 DLL,然后启动一些线程,一旦播放结束,线程就会退出并且 DLL 会被卸载。所以我的猜测是打开/关闭是可选的,因为系统会自动执行所有分配/解除分配,但我可能错了。如果我只调用上面的行而不是别的,我是否会泄漏一些内存或资源?
这是调试日志显示的内容 - 我可以从这个日志中得出结论,线程已关闭并且 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)