本文介绍如何利用.rc资源文件将某些(二进制)数据放到exe/dll中,并进行读取。
.rc(资源文件)经过编译后可以生成一个可供链接的资源文件.res,在.res文件中会将rc中引用的所有资源文件都打包在里面。可以通过rc.exe将rc.rc编译成Res.res
rc.exe /fo ./Res.res ./rc.rc
然后我们通过连接器link.exe将res文件与obj文件一起链接,生成exe文件
link /OUT:main.exe ./main.obj ./Res.res
其中main.obj通过cl.exe生成
cl.exe /Fe./ /c main.cpp
讲了那么多windows编译器的原理。。下面进入正题
1,添加创建资源文件
2,添加资源数据
双击打开刚刚新建的Resource.rc
然后添加资源
本文打算添加一个现有的记事本文件,所以我选导入
然后我们选data.txt(自己新建一个txt,里面内容随意)
注意右下方类型要选为所有文件才能看到txt类型的文本文件
然后我们给这个文件取个类型,我取Data(这里大小写不重要,最终都会转换成大写)
我们刚刚添加的资源文件会被自动编码,并有一个常量对应其编码
3,引用刚刚的数据
我们可以通过下面的代码读取刚刚插入的txt的内容并输出
#include "stdafx.h"
#include "resource.h"
#include <windows.h>
#include <iostream>
#include "ConsoleApplication1.h"
int main()
{
HMODULE hmExe = GetModuleHandle(NULL);
HRSRC hRdata2 = FindResource(hmExe, MAKEINTRESOURCE(IDR_DATA2), TEXT("Data"));
DWORD dwSize = SizeofResource(hmExe, hRdata2);
HGLOBAL hGlobal = LoadResource(hmExe, hRdata2);
char * str = (char *)LockResource(hGlobal);
std::cout << dwSize << std::endl;
std::cout << str << std::endl;
return 0;
}
其中
HMODULE WINAPI GetModuleHandle( _In_opt_ LPCTSTR lpModuleName )
获取当前exe程序在内存中的句柄(实际上是DOS头指针啦)
HRSRC WINAPI FindResource( _In_opt_ HMODULE hModule, _In_ LPCTSTR lpName, _In_ LPCTSTR lpType );
获取资源信息的句柄
HGLOBAL WINAPI LoadResource(_In_opt_ HMODULE hModule,_In_ HRSRC hResInfo);
可以获取资源信息的大小
LPVOID WINAPI LockResource(_In_ HGLOBAL hResData);
获取资源数据的指针,就是取到我们的data.txt在内存中的指针
别忘了引入windows.h和resource.h