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

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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值