添加:
1)在工作区窗口的ResourceView选项卡中,用鼠标右键单击任意节点,在弹出的快捷菜单中选择Import命令。(如果没有对应的节点,点击插入->资源,新建一个.rc文件)
2)在弹出的Import Resource对话框中选择要添加的资源文件
3)单击Import按钮,添加资源,这时会弹出Custom Resource Type对话框,用户需要在该对话框中设置资源类型
4)单击OK按钮,将资源添加到工程中
使用:
要使用自定义资源,我们可能要用到的几个API函数有FindResource、LoadResource和LockResource等,这里每一个函数的返回值分别作为下一个函数的参数,我来简要介绍一下。
1)FindResource用来在一个指定的模块中定位所指定的资源:
HRSRC
FindResource(
HMODULE
hModule,
//包含所需资源的模块句柄,如果是程序本身,可以置为NULL
LPCTSTR
lpName,
//可以是资源名称或资源ID
LPCTSTR
lpType
//资源类型,在这里也就是我们自己指定的资源类型
);
2.LoadResource用来将所指定的资源加载到内存当中;
HGLOBAL
LoadResource(
HMODULE
hModule,
//模块句柄,同上
HRSRC
hResInfo
//需要加载的资源句柄,这里也就是FindResource的返回值
);
3.LockResource用来锁定内存中的资源数据块,它的返回值也就是我们要使用的直系指向资源数据的内存指针;
LPVOID
LockResource(
HGLOBAL
hResData
//指向内存中要锁定的资源数据块,这里也就是LoadResource的返回值
);
另外我们还需要用SizeofResource来确定资源的尺寸,我们在操作资源时要用到它。在资源使用完毕后我们不需要使用UnlockResource和FreeResource来手动地释放资源,因为它们都是16位Windows遗留下来的,在Win32中,在使用完毕后系统会自动回收。它们的使用很简单,大致上是这个样子的:
BOOL
UseCustomResource()
{
//定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
HRSRC
hRsrc = FindResource(NULL, MAKEINTRESOURCE(ITEMID), TEXT(
"MyType"
));
if
(NULL == hRsrc)
return
FALSE;
//获取资源的大小
DWORD
dwSize = SizeofResource(NULL, hRsrc);
if
(0 == dwSize)
return
FALSE;
//加载资源
HGLOBAL
hGlobal = LoadResource(NULL, hRsrc);
if
(NULL == hGlobal)
return
FALSE;
//锁定资源
LPVOID
pBuffer = LockResource(hGlobal);
if
(NULL == pBuffer)
return
FALSE;
//我们用刚才得到的pBuffer和dwSize来做一些需要的事情。可以直接在内存中使
//用,也可以写入到硬盘文件。这里我们简单的写入到硬盘文件,如果我们的自定
//义资源是作为嵌入DLL来应用,情况可能要复杂一些。
BOOL
bRt = FALSE;
FILE
* fp = _tfopen(_T(
"demo.exe"
), _T(
"wb"
));
if
(fp != NULL)
{
if
(dwSize ==
fwrite
(pBuffer,
sizeof
(
char
), dwSize, fp))
bRt = TRUE;
fclose
(fp);
}
//FreeResource(hGlobal);
return
bRt;
}