如何正确使用mciSendString

时间:2014-01-24 17:56:13

标签: delphi c++builder multimedia mci

我使用以下mciSendString

播放MP3声音

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

以上工作正常。但是从我在网络上看到的情况来看,人们会使用各种包装来获取上述代码。有些先发送open命令然后发送play,然后等待通知,然后发送close命令,它们也会使用别名等文件。

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

从我在调试器中可以看到,在执行上述命令时,系统会加载所需的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)

1 个答案:

答案 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的路径,并且其中没有空格。