现在的位置: 首页 > 综合 > 正文

VC中如何将资源打包并释放到指定文件夹

2013年08月01日 ⁄ 综合 ⁄ 共 2139字 ⁄ 字号 评论关闭

很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行,

很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件

遇到破坏时,也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.

下面我来说一说这种程序比较普通的一些做法:

首先在程序入口处,我们以MFC程序为例子,我们找到APP文件,在InitInstance()中执行文件检查,如果发现某些文件损坏或者不存在,

那么我们将自身资源包的正常文件释放出来,在这里我给出两个函数,一个是检查指定文件是否存在,另一个是释放资源包文件的函数.

BOOL FileExteriorFile(LPCTSTR FileName)//查找指定的文件是否存在
{
 WIN32_FIND_DATA fd;
 HANDLE hd=::FindFirstFile(FileName,&fd);//开始查找
 if(hd==INVALID_HANDLE_VALUE)
 {
  return FALSE;
 }
 FindClose(hd);//关闭查找
 return TRUE;
}

发现不存在时,将调用下面的函数释放资源包的文件

//将指定资源释放到指定目录下生成特定文件
BOOL FreeMyData(LPCTSTR ResName, LPCTSTR ResType, LPCTSTR FileName, int Type)
{
 BOOL bRet = TRUE;
 HINSTANCE hInst = AfxGetInstanceHandle();
 
 //先判断我们指定的资源是否存在
 HRSRC hResInfo = FindResource(hInst,ResName,ResType);
 
 if(hResInfo == NULL)
  return FALSE;
 
 HANDLE hFile = NULL; 
 DWORD dwWritten = 0; 
 
 //开始调入指定的资源到内存 
 HGLOBAL hResData = LoadResource(hInst,hResInfo);
 LPVOID pvResData = LockResource(hResData);
 DWORD dwResSize = SizeofResource(hInst,hResInfo); 
 
 //再创建目标文件并保存数据至文件
 if(Type == 1)//系统加隐藏属性 如果指定类型为1,那么加上系统和隐藏属性,防止普通用户对文件进行破坏
 {
  hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
   NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, NULL);
  WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
 }
 else
 {
  hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
   NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
  WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
 }
 if(hFile == INVALID_HANDLE_VALUE)//创建文件失败
 {
  FreeResource(hResData);
  return FALSE;
 }
 
 //释放有关内存资源
 CloseHandle(hFile);
 FreeResource(hResData);
 
 return TRUE;
}

将上面两个函数COPY到你工程的APP文件中,现在假设你已将一个Demo.dat文件通过资源映射导入工程当中,类型属于ExFile,文件名是IDR_EXFILE1,

那么你在InitInstance()中的调用形式如下:

if(!FileExteriorFile(FileName))//注意:FileName是你指定目录下的指定文件
 {
  if(!FreeMyData(MAKEINTRESOURCE(IDR_EXFILE1), "ExFile", FileName,0))//释放文件到指定目录
  {
   MessageBox(NULL,FileName,"Free File Fail:",MB_ICONERROR);
  }

 }

这样你就已实现了将资源包释放出来替换或者覆盖某些文件的目的,你可以释放的文件类型可以是EXE文件,DLL文件等等.

在编写该程序的过程当中,我还加入了很多特殊的功能,比如释放出一个新的EXE文件,然后执行,再把自身销毁,这个时候杀毒程序警告我,这是一个病毒,

哈哈,可能病毒就是这样的搞的.那么你还等什么,赶快试试吧.

转载请注明:本文出自www.vcfans.cn/bbs

抱歉!评论已关闭.