将 mp3 等音乐资源以资源形式嵌入 exe 文件中
引用:http://www.easyx.cn/skills/View.aspx?id=6
本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用。嵌入 mp3 和嵌入图片略有不同,将图片嵌入到 exe 中,以及访问嵌入 exe 中的图片,请参考:http://www.easyx.cn/skills/View.aspx?id=6
【一、以资源文件形式嵌入 exe】
关于“资源文件”的介绍和“将 mp3 以资源形式嵌入 exe 文件中”的步骤,请仿照 http://www.easyx.cn/skills/View.aspx?id=6。
【二、播放资源文件中的 mp3】
1. 思路
查看 MSDN 中关于 mciSendString 的使用,发现并不支持直接读取资源文件中的媒体文件,也不支持读取内存中的媒体文件。因此,我们需要提取资源
文件中的 mp3 为成临时文件,然后调用 mciSendString 播放,播放结束后再删掉这个临时文件。
2. 提取资源文件中的为临时文件
这个步骤不算复杂,只需要将资源文件中的资源读取到内存中,然后将内存数据写入文件即可。针对资源 ID 为字符串和宏两种形式,核心代码如下:

1 //////////////////////////////////////////////////////////////////
2 // 提取指定模块中的资源文件
3 // 参数:
4 // strDstFile: 目标文件名。提取的资源将保存在这里;
5 // strResType: 资源类型;
6 // strResName: 资源名称;
7 // 返回值:
8 // true: 执行成功;
9 // false: 执行失败。
10 bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName)
11 {
12 // 创建文件
13 HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
14 if (hFile == INVALID_HANDLE_VALUE)
15 return false;
16
17 // 查找资源文件中、加载资源到内存、得到资源大小
18 HRSRC hRes = ::FindResource(NULL, strResName, strResType);
19 HGLOBAL hMem = ::LoadResource(NULL, hRes);
20 DWORD dwSize = ::SizeofResource(NULL, hRes);
21
22 // 写入文件
23 DWORD dwWrite = 0; // 写入大小
24 ::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
25 ::CloseHandle(hFile);
26
27 return true;
28 }

3. 使用 mciSendString 播放音乐
这一步利用第 2 步导出的文件名,直接用 mciSendString 播放。mciSendString 的使用方法请参考:http://www.easyx.cn/skills/View.aspx?id=44
4. 删除临时文件
临时文件如果不再使用,请及时删除。可以使用 windows api 函数 DeleteFile。
【三、范例 1】
下面是一个完整的范例项目,该项目中有一个 "MP3" 类型的资源文件,资源 ID 为字符串 "background.mp3",播放这个 mp3 的范例代码如下:

1 ///////////////////////////////////////////////////
2 // 程序名称:范例:播放以资源形式保存的 mp3 音乐
3 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版
4 // 作 者:yangw80 <yw80@qq.com>
5 // 最后修改:2011-10-7
6 //
7 #include <graphics.h>
8 #include <conio.h>
9 #include <stdio.h>
10 #pragma comment(lib, "Winmm.lib") // 引用 Windows Multimedia API
11 // #include "resource.h" // 注:如果资源 ID 为宏定义,请取消这行注释
12
13
14 //////////////////////////////////////////////////////////////////
15 // 提取指定模块中的资源文件
16 // 参数:
17 // strDstFile: 目标文件名。提取的资源将保存在这里;
18 // strResType: 资源类型;
19 // strResName: 资源名称;
20 // 返回值:
21 // true: 执行成功;
22 // false: 执行失败。
23 bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName)
24 {
25 // 创建文件
26 HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
27 if (hFile == INVALID_HANDLE_VALUE)
28 return false;
29
30 // 查找资源文件中、加载资源到内存、得到资源大小
31 HRSRC hRes = ::FindResource(NULL, strResName, strResType);
32 HGLOBAL hMem = ::LoadResource(NULL, hRes);
33 DWORD dwSize = ::SizeofResource(NULL, hRes);
34
35 // 写入文件
36 DWORD dwWrite = 0; // 返回写入字节
37 ::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
38 ::CloseHandle(hFile);
39
40 return true;
41 }
42
43
44 // 主函数
45 void main()
46 {
47 // 初始化图形窗口
48 initgraph(640, 480);
49
50 // 输出提示信息
51 outtextxy(0, 0, _T("按任意键开始播放"));
52 _getch();
53
54 // 产生临时文件的文件名
55 TCHAR tmpmp3[_MAX_PATH];
56 ::GetTempPath(_MAX_PATH, tmpmp3);
57 _tcscat(tmpmp3, _T("testapp_background.mp3")); // VC2008、VC2010 请用 _tcscat_s 函数
58
59 // 将 MP3 资源提取为临时文件
60 ExtractResource(tmpmp3, _T("MP3"), _T("background.mp3"));
61 // 注:如果 MP3 资源的 ID 为宏 IDR_BACKGROUND,这样做:
62 // ExtractResource(tmpmp3, _T("MP3"), MAKEINTRESOURCE(IDR_BACKGROUND));
63
64 // 打开音乐
65 TCHAR mcicmd[300];
66 _stprintf(mcicmd, _T("open \"%s\" alias mymusic"), tmpmp3); // VC2008、VC2010 请用 _stprintf_s 函数
67 mciSendString(mcicmd, NULL, 0, NULL);
68
69 // 播放音乐
70 mciSendString(_T("play mymusic"), NULL, 0, NULL);
71
72 // 输出提示信息
73 outtextxy(0, 0, _T("按任意键停止播放"));
74 _getch();
75
76 // 停止播放并关闭音乐
77 mciSendString(_T("stop mymusic"), NULL, 0, NULL);
78 mciSendString(_T("close mymusic"), NULL, 0, NULL);
79
80 // 删除临时文件
81 DeleteFile(tmpmp3);
82
83 // 输出提示信息
84 outtextxy(0, 0, _T("按任意键退出程序"));
85 _getch();
86
87 // 关闭图形窗口
88 closegraph();
89 }

http://www.cnblogs.com/zjutlitao/p/3735468.html
将 mp3 等音乐资源以资源形式嵌入 exe 文件中的更多相关文章
- [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中
引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...
- 在Visual Studio中将dll以资源的形式嵌入exe中
一.Dll的优点: 1.扩展应用程序的特性 2.简化项目管理 3.有助于节省内存 4.促进资源的共享 5.促进本地化 6.有助于解决平台间的差异 7.可用于特殊目的 有关于dll及注入相关理论资料,可 ...
- 注解形式读取properties文件中的属性
1.spring.xml中加入(多个properties 用逗号隔开) <context:property-placeholder location="classpath:jdbc. ...
- 如何在Qt资源文件中包含和释放exe等各种类型文件?
操作系统:Windows 10 X64 企业版 Qt: 5.8.0 QtCreater: 4.2.1 刚刚开始学习Qt,不断遇到困难和挑战,前几天在各个QQ群里询问如何在Qt的资源文件中包含和释放ex ...
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
一.@代表引用资源 1.引用自定义资源.格式:@[package:]type/name android:text="@string/hello" 2.引用系统资源.格式:@andr ...
- (转载)Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
原帖地址:http://blog.csdn.net/zfrong/article/details/7332545 Android xml资源文件中@.@android:type.@*.?.@+引用写法 ...
- 【转】Android xml资源文件中@、@android:type、@*、?、@+含义和区别
一.@代表引用资源 1.引用自定义资源.格式:@[package:]type/name android:text="@string/hello" 2.引用系统资源.格式:@andr ...
- 3、flink架构,资源和资源组
一.flink架构 1.1.集群模型和角色 如上图所示:当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager.由 Client 提交任务给 JobMa ...
- VC中如何将资源打包并释放到指定文件夹
转载请注明来源:https://www.cnblogs.com/hookjc/ 很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行 ...
随机推荐
- Python学习之day4
参考文献:http://www.cnblogs.com/alex3714/articles/5143440.html 迭代器: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直 ...
- Sed简介 (转)
Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓 ...
- Swift--基本数据类型(一)
不像更多语言中,X不要求你写一个分号(;)在你的代码中的每一个语句后,尽管能够这样做.然而,假设你想在一行中写入多个单独的语句分号是必需的: . 1 let cat = "" ...
- [计算机网络] vsftpd的安装与使用
简单介绍: vsftpd是一个能够执行在类UNIX操作系统上的FTPserver软件,它能够执行在Linux.BSD.Solaris.HP-UX等系统上. 1 vsftpd的安装 在ubuntu系统上 ...
- 获取系统的emoji表情定制键盘
首先 ,想要获取系统的表情,要首先知道表情对应的UTF8 的编码方式,我将其中一部分的图片展示出来 ,然后用UIButton 排列,iOS 7后又增加了300多个表情符号,这些都可以百度查到,现在上代 ...
- Memcache 查看列出所有key方法
参考博文: Memcache 查看列出所有key方法 1. cmd上登录memcache telnet 127.0.0.1 11211 2. 列出所有keys stats items // 这条是命 ...
- 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
开发快很重要——如果只看语法或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦,太慢了,太麻烦了,虽然在反复调试和优化之后,最后产品的结果可能还不错. Delphi的最大特 ...
- 转:js包装DOM对象
我们在日常的应用中,使用Javascript大多数时间都是在用DOM ,以致于很多人都有一种看法就是DOM==JS,虽然这种看法是错误的,但是也可以说明DOM的重要性. 这就导致了我们在写JS的时候, ...
- MVC是一种用于表示层设计的复合设计模式
它们之间的交互有以下几种: 1.当用户在视图上做任何需要调用模型的操作时,它的请求将被控制器截获. 2.控制器按照自身指定的策略,将用户行为翻译成模型操作,调用模型相应逻辑实现 ...
- poj2676解题报告
题意:有一个9*9的格子 分成了9个3*3的小子格,一些位置上的已有一些数字..现在要求你把没有数字的位置填上数,要求这个数没有出现在这个位置所在的行.列以及所在的子格 分析: 那么我们对于所有的未填 ...