向exe内嵌入wav音频并使用(Windows)

对于编程初学者来说,我们的作品成果往往是一个简单的exe文件(Windows下),而我们也曾看到过很多破解器仅仅用一个exe文件就可以实现播放背景音乐的效果,于是我们想能否在自己编写的exe程序里加入音频文件并播放,这篇文章将教大家如何实现这种效果(仅限wav音频,同一时刻只能播放一个音频),我们以vs2019为例:

首先,这里有一个标准的c++程序:

 #include <iostream>
 #include <Windows.h>
 
 using namespace std;
 int main()
 {
     cout << "Hello World!\n";
 }

我们在vs2019中新建项目并在main.cpp中写入这段代码:

然后,我们找到vs右侧的解决方案资源管理器面板(如果没有,我们可以点击vs菜单中的视图并点击解决方案资源管理器),右键资源文件,添加,新建项:

在弹出的窗口中选择Visual C++,资源,资源文件(.rc),然后点击添加:

这时vs会自动在右侧打开资源视图,右键生成的.rc文件,然后选择添加资源:

在弹出的窗口中选择导入:

然后找到我们想要添加的音频,注意右下角更改一下文件类型,打开后在资源视图会多出一个项目,我们记住该项目的字段(IDR_WAVE1)然后右键资源视图,点击保存xxx.rc:

我们回到解决方案资源管理器,会发下在头文件中多出了对应名称的头文件(xxx.h),我们在我们的项目中引用该文件,同时,为了让PlaySound正常工作,我们还需调用系统库:

 #include"resource.h"
 #include <iostream>
 #include<Windows.h>
 #pragma comment(lib, "WINMM.LIB")

 using namespace std;
 int main()
 {
     cout << "Hello World!\n";
 }

随后,我们在需要播放音频的位置加入以下代码:

PlaySound(LPCWSTR(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC | SND_LOOP);

其中,IDR_WAVE1为刚刚生成的字段,后面的SND_ASYNC表示用异步方式播放声音,SND_LOOP表示循环播放音频,更多关于PlaySound的用法可以参考https://baike.sogou.com/v10930259.htm?fromTitle=playsound

如果需要停止播放,则可加入以下代码:

PlaySound(NULL,NULL,NULL);

随后,我们点击生成,生成解决方案,找到生成的exe文件发现文件大小已经变大,说明我们将音频嵌入到exe中的操作成功了,不过通过这种方式嵌入的音频在同一时间只能播放一个音频,后续我会推出相关文章。

发表评论

您的电子邮箱地址不会被公开。