VC实现将资源打包并释放到指定文件夹
来源:优易学  2011-12-10 16:42:57   【优易学:中国教育考试门户网】   资料下载   IT书店
  很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行,很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件遇到破坏时,也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.下面我来说一说这种程序比较普通的一些做法:
  首先在程序入口处,我们以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文件,然后执行,再把自身销毁,这个时候杀毒程序警告我,这是一个病毒,哈哈,可能病毒就是这样的搞的.那么你还等什么,赶快试试吧.

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训