最近,在看金山的bkkuilib界面库,发现了以前不了解的vc 自定义资源技术。经数小时研究,成此文。
自定义资源的语法格式为
资源ID 自定义资源类型名 文件路径
添加自定义资源的步骤如下
1.按上语法格式,在rc文件中添加语句。
2.在resource.h头文件中,定义资源ID。
3.使用FindResoource等API,使用自定义资源。
举例:添加自定义资源,资源名为XML。并在IDE 输出窗口中输出XML语句
1.打开rc文件,添加如入语句
IDR_XML1 XML "skins//def_skin.xml"
IDR_XML5 XML "skins//dlg_main.xml
def_skin.xml的文件内容为
2.打开resource.h头文件,添加如下语句
#define IDR_XML2 105
#define IDR_XML1 106
#define IDR_XML5 107
3.编译。我们先看一下,XML类型的自定义资源是否嵌入到exe中了
如下图所示
xml资源已经嵌入到exe中了。
4.使用嵌入的XML资源。
代码如下
static BOOL LoadEmbedResource() { CStringA strRet; //#define IDR_XML1 106 HRSRC hRsrc = ::FindResource(NULL, MAKEINTRESOURCE(106),L"XML"); 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; memcpy(strRet.GetBuffer(dwSize + 1), pBuffer, dwSize); OutputDebugStringA((LPCSTR)strRet); strRet.ReleaseBuffer(dwSize); ::FreeResource(hGlobal); return TRUE; }
输出结果为
其实,内嵌资源就是pe 文件结构中的一个段,如果想更清楚的了解exe资源问题,请参看pe文件结构。