win32 资源文件使用——获取资源数据的指针

本文介绍如何利用.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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据