首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用mciSendString

如何正确使用mciSendString
EN

Stack Overflow用户
提问于 2014-01-24 17:56:13
回答 1查看 7.4K关注 0票数 1

我使用下面的MP3播放一个mciSendString声音

mciSendString("play \"mysound.mp3\"", NULL, 0, 0);

上面的效果很好。但是根据我在网上看到的,人们对上面的代码使用各种各样的包装器。有些人首先发送open命令,然后是play,然后等待通知,然后发送close命令,他们也使用别名文件等。

我的问题是-所有这些都有必要吗?我的主要兴趣是播放一个文件,并以异步的方式完成它。上面的命令似乎完成了所有的清理,所以我的问题是-当声音被播放时,是否真的需要使用openclose命令和通知来正确释放内存和释放声音,这样做是否有好处。

从调试器中可以看到,在执行上述命令时,系统将加载所需的DLL,然后启动一些线程,在播放结束后,线程退出和DLL将被卸载。因此,我的猜测是,open/close是可选的,因为系统会自动完成所有的分配/取消分配,但我可能错了。我是否漏了一些内存或资源,如果我只是调用上面的行,而没有其他?

以下是调试日志显示的内容--我从这个日志中可以得出的结论是,线程已经关闭,DLL文件已经卸载:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-26 19:05:05

我在其他地方找到了答案所以我分享了。

看来play命令本身是完全有效的。

这里有几种方法可以称之为:

代码语言:javascript
复制
// (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的路径,该路径中没有空格。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21339248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档