[MFC] MFC 用mciSendString加载WAV资源文件

简介:


@ - @  

  FIRDST:为什么不用路径加载?

  因为mciSendString函数不支持加载资源文件里的WAV资源,如果按路径加载,那么你的WAV就暴露在exe之外,无法实现音频资源的很好保护。

  SECOND:为什么不用PlaySound(MAKEINTRESOURCE(IDR_WAVE_HIT),AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC);直接加载资源文件播放呢?

   其实这样是可以的,但是这里有2方面考虑:首先PS函数不能加载mp3格式文件,其次有时候游戏编写过程中同时使用PS函数和mciSS函数可以实现混音效果,如果只用PS函数就只能播放一种音乐出现麻烦!

 

复制代码
 1 bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName){//中间调用函数
 2     // 创建文件
 3     HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
 4     if (hFile == INVALID_HANDLE_VALUE)
 5         return false;
 6 
 7     // 查找资源文件中、加载资源到内存、得到资源大小
 8     HRSRC    hRes    = ::FindResource(NULL, strResName, strResType);
 9     HGLOBAL    hMem    = ::LoadResource(NULL, hRes);
10     DWORD    dwSize    = ::SizeofResource(NULL, hRes);
11     
12     // 写入文件
13     DWORD dwWrite = 0;      // 返回写入字节
14     ::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
15     ::CloseHandle(hFile);
16 
17     return true;
18 }
19 //--------------------------------------------------------------
20 void init(){//初始化函数
21     // 产生临时文件的文件名
22     TCHAR tmpwav[_MAX_PATH];
23     ::GetTempPath(_MAX_PATH,tmpwav);
24     _tcscat_s(tmpwav, _T("testapp_background.wav"));        // VC2008、VC2010 请用 _tcscat_s 函数
25     // 将wav 资源提取为临时文件
26     //ExtractResource(tmpwav,_T("WAVE"), "background.mp3");
27     // 注:如果wave资源的 ID 为宏 IDR_BACKGROUND,这样做:
28     ExtractResource(tmpwav, _T("WAVE"), MAKEINTRESOURCE(IDR_WAVE_POINT));
29     // 打开音乐
30     TCHAR mcicmd[300];
31     _stprintf_s(mcicmd, _T("open \"%s\" alias mymusic"),tmpwav);        // VC2008、VC2010 请用 _stprintf_s 函数
32     mciSendString(mcicmd, NULL,0, NULL);
33     // 播放音乐
34     mciSendString(_T("play mymusic"), NULL, 0, NULL);
35     // 停止播放并关闭音乐
36     mciSendString(("stop mymusic"), NULL, 0, NULL);
37     mciSendString(("close mymusic"), NULL, 0, NULL);
38     // 删除临时文件
39     DeleteFile(tmpmp3);
40 }
41 //--------------------------------------------------------------
42 //如果是初始化里的情况只能播放一次,想要多次播放,先要把mcicmd[]设为全局变量
43 //再把:下面几条语句注释掉
44 //mciSendString(mcicmd, NULL,0, NULL);
45 //mciSendString(_T("play mymusic"), NULL, 0, NULL);
46 //mciSendString(("stop mymusic"), NULL, 0, NULL);
47 //mciSendString(("close mymusic"), NULL, 0, NULL);
48 //DeleteFile(tmpmp3);
49 //再在该调用的位置使用下面的play函数!!!
50 void play(){//播放函数
51     mciSendString(_T("close mymusic"), NULL, 0, NULL);//先关再开,注意顺序!!!
52     mciSendString(mcicmd, NULL,0, NULL);
53     mciSendString(_T("play mymusic"),NULL,0, NULL);        
54 }//------------------------------------------------------------
复制代码

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3577592.html,如需转载请自行联系原作者

相关文章
|
3月前
QT6使用CMamke将qml打包成dll
QT6使用CMamke将qml打包成dll
55 0
|
5月前
Qt使用资源文件QtResource
Qt使用资源文件QtResource
100 5
|
5月前
Qt 添加资源文件
Qt 添加资源文件
|
C# 图形学 C++
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
📢前言 🎬生成DLL文件 🎥使用 C#类库 将Unity中的脚本打包成 DLL文件 并调用 🏳️‍🌈第一步:打开Visual Studio之后,新建一个项目 🏳️‍🌈第二步:选择类库(.NET Framework),改个名字,选择一个位置路径 🏳️‍🌈第三步:然后在创建的脚本中简单写一点代码,如下所示 🏳️‍🌈第四步:然后在解决方案资源管理器右键这个脚本 -> 添加 -> 引用 🏳️‍🌈第五步:然后点击浏览,找到Unity安装路径 -> Editor -> Data -> Managed 下的这两个DLL 文件,点击添加!
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
|
编译器 C# 图形学
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
📢前言 🎬通过VC 生成DLL文件 🎥在VS中生成DLL文件 🏳️‍🌈第一步:新建一个dll项目 🏳️‍🌈第二步:新建一个`.h头文件`和`.cpp源文件` 🏳️‍🌈第三步:在`.h头文件`和`.cpp源文件`中编写代码 🏳️‍🌈第四步:生成dll和lib文件 🎥在VS中进行调用DLL文件 🚩第一步:先来新建一个项目 🚩第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h 🚩第三步:在新项目里面添加C++代码 🚩第四步:添加头文件firstDLLTest.h和firstDLLTest.
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
|
Android开发 iOS开发 图形学