VC使用自定义资源,FindResource,LoadResource,UnLockResource

VC/MFC 专栏收录该内容
199 篇文章 2 订阅

1. 自定义类型的作用
在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型,作用如下:
(1)默认的皮肤压缩包或语言包。一些支持换肤的软件特别是一些媒体播放器常常有自定义的皮肤文件,同样,一些支持多语言的EXE文件中存在默认语言包也是这个道理;
(2)做为一些病毒/木马程序的寄生方式。如果不小心执行了带有病毒/木马的程序,它们会在你运行时释放出病毒/木马文件。当然许多病毒是将自身写入PE文件头来实现;
(3)合并EXE与它所需要的DLL文件。出于某些原因程序作者有时可能需要将DLL文件嵌入到可执行的EXE文件中,这可以通过使用自定义资源来实现;
(4)其它需要在程序中播放一个AVI动画等等,都可以通过将二进制的数据文件作为自定义资源加入到可执行文件中来实现;

2. 相关API函数
要使用自定义资源,我们可能要用到的几个API函数有FindResource、LoadResource和LockResource等,这里每一个函数的返回值分别作为下一个函数的参数,介绍如下。

FindResource用来在一个指定的模块中定位所指定的资源:
HRSRC FindResource(
HMODULE hModule,        //包含所需资源的模块句柄,如果是程序本身,可以置为NULL
LPCTSTR lpName,         //可以是资源名称或资源ID
LPCTSTR lpType          //资源类型,在这里也就是我们自己指定的资源类型
);     
LoadResource用来将所指定的资源加载到内存当中;
HGLOBAL LoadResource(
HMODULE hModule,        //模块句柄,同上
HRSRC   hResInfo        //需要加载的资源句柄,这里也就是FindResource的返回值
);             
LockResource用来锁定内存中的资源数据块,它的返回值也就是我们要使用的直系指向资源数据的内存指针;
LPVOID  LockResource(
HGLOBAL hResData        //指向内存中要锁定的资源数据块,这里也就是LoadResource的返回值
);  
另外我们还需要用SizeofResource来确定资源的尺寸,我们在操作资源时要用到它。
在资源使用完毕后我们不需要使用UnlockResource和FreeResource来手动地释放资源,因为它们都是16位Windows遗留下来的,在Win32中,在使用完毕后系统会自动回收.


默认情况下,VC支持Dialog、Bitmap、Icon、HTML等资源类型,如下:


其类型定义在 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\WinUser.h,如下:

/*
 * Predefined Resource Types
 */
#define RT_CURSOR           MAKEINTRESOURCE(1)
#define <span style="color:#FF0000;">RT_BITMAP</span>           MAKEINTRESOURCE(2)
#define <span style="color:#FF0000;">RT_ICON</span>             MAKEINTRESOURCE(3)
#define RT_MENU             MAKEINTRESOURCE(4)
#define RT_DIALOG           MAKEINTRESOURCE(5)
#define RT_STRING           MAKEINTRESOURCE(6)
#define RT_FONTDIR          MAKEINTRESOURCE(7)
#define RT_FONT             MAKEINTRESOURCE(8)
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
#define RT_RCDATA           MAKEINTRESOURCE(10)
#define RT_MESSAGETABLE     MAKEINTRESOURCE(11)

如果想把自定义文件也编译到资源中,则需要添加资源,如下:

添加资源类型为“config"的配置文件"WebBrushCfg.ini"和"WebBrushUrl.txt"

双击资源项查看内容:



代码中读取资源,并释放到文件:

步骤:

FindResource()
LoadResource()
FreeResource()
注意:通常不需要UnlockResource(),由系统自动完成.
CSDN解释:UnlockResource,It is not necessary to unlock resources because the system automatical

(1) 先判断配置文件书否存在:

if (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(sUrlFile))
{
	OutputDebugString("Free file: " + sUrlFile + "\r\n");

	//释放资源
	if (!FreeResouseToFile(MAKEINTRESOURCE(IDR_CONFIG2), "Config", sUrlFile, 0))
	{
		OutputDebugString("Error: Failed to free file " + sUrlFile + "\r\n");
		return FALSE;
	}
}
(2) 不存在从资源释放,并保存到文件

//将指定资源释放到指定目录下生成特定文件
BOOL CWebBrushDlg::FreeResouseToFile(LPCTSTR lpResName, LPCTSTR lpResType, LPCTSTR lpFileName, int nType)
{
	//HINSTANCE hInst = GetModuleHandle(NULL);
	//HINSTANCE hInst = AfxGetResourceHandle();
	HINSTANCE hInst = AfxGetInstanceHandle();
	if (NULL == hInst)
	{
		return FALSE;
	}

	//先判断我们指定的资源是否存在
	HRSRC hResInfo = FindResource(hInst, lpResName, lpResType);
	if (NULL == hResInfo)
	{
		return FALSE;
	}

	//开始调入指定的资源到内存
	HGLOBAL hResData = LoadResource(hInst, hResInfo);
	LPVOID lpResData = LockResource(hResData);
	DWORD dwResSize = SizeofResource(hInst, hResInfo);

	//再创建目标文件并保存数据至文件
	//类型为1表示加上系统和隐藏属性,防止普通用户对文件进行破坏
	HANDLE hFile = INVALID_HANDLE_VALUE;
	if (1 == nType)
	{
		hFile = CreateFile(lpFileName,
			GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM,
			NULL);
	}
	else
	{
		hFile = CreateFile(lpFileName,
			GENERIC_READ | GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);
	}

	//创建文件失败
	if (INVALID_HANDLE_VALUE == hFile)
	{
		FreeResource(hResData);
		return FALSE;
	}

	//保存到文件
	DWORD dwWritten = 0;
	if (!WriteFile(hFile, lpResData, dwResSize, &dwWritten, NULL))
	{
		FreeResource(hResData);
		CloseHandle(hFile);
		return FALSE;
	}

	//释放有关内存资源
	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	FreeResource(hResData);
	return TRUE;
}






  • 2
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p style="color:#666666;"> <span style="font-size:14px;">本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">平时不明白的知识点,放在项目里去理解就恍然大悟了。</span> </p> <p style="color:#666666;"> <span></span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>一、融汇贯通</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>二、贴近实战</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>三、课程亮点</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>适合人群:</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">2、有Django基础,但是想学习企业级项目实战的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">3、有MySQL数据库基础的朋友</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><img alt="" src="https://img-bss.csdnimg.cn/202009070752197496.png" /><br /> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><br /> </span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值