最近在做一个项目,需要把多个文件的内容合并到一个文件中。如果使用读文件的方法,所有的文件都要保存在同一目录下,使用的时候需要复制很多文件,不是很方便。于是想把这些文件当作资源加载到程序中,使用的时候直接释放出来。方法如下
1.资源插入方法
打开工程中的资源视图 ->插入资源, 选择自己要插入的类型进行,本文插入的是HTML。插入后修改资源ID(根据个人喜好)
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的返回值
);
需要注意的是FindResource()中第三个参数,资源类型的写法,本文用的是HTML,类型为RT_HTML(类型前面要加上RT_),刚开始的时候写的是HTML,总是提示查找资源失败。
完整代码如下:
ReleaseRes(CString strFileName,DWORD wResID,CString strFileType)
{
HINSTANCE hIns=GetModuleHandle("dlllib.dll");
HRSRC hrsc = ::FindResource(hIns, MAKEINTRESOURCE(wResID), strFileType);
if (hrsc == NULL)
{
MessageBox(NULL,TEXT("资源查找失败!!!"),TEXT("失败!!"),MB_OK);
DWORD rtn = GetLastError();
printf("%s\n",rtn);
return FALSE;
}
HGLOBAL hG = LoadResource(hIns, hrsc);
if (NULL == hG)
{
MessageBox(NULL,TEXT("加载资源失败!!!"),TEXT("失败!!"),MB_OK);
return FALSE;
}
LPVOID lp = LockResource(hG);
if (NULL == lp)
{
MessageBox(NULL,TEXT("锁定资源失败!!!"),TEXT("失败!!"),MB_OK);
return FALSE;
}
DWORD dwSize = SizeofResource( hIns, hrsc);
printf("the resource size is %d\n",dwSize);
// 创建文件
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
return FALSE;
}
DWORD dwWrite = 0;
// 写入文件
WriteFile(hFile,hG,dwSize,&dwWrite,NULL);
CloseHandle( hFile );
//释放资源
FreeResource(hrsc);
return TRUE;
}
参考文章
http://blog.csdn.net/jiangqin115/article/details/42081965