VC中如何將資源打包並釋放到指定文件夾

很多時候,我們可能要將某些文件打包到資源中,然後當程序執行的時候,發現缺少某些文件時,進行自我修復,以維持程序的正常執行,

很多安裝程序或者比較高級點的智能程序都已經這樣做,比如文件損壞時,安裝程序將修復這些文件.一些高級程序的常用設置及文件

遇到破壞時,也會自我修復,它們的這些神奇功能,全都是依靠自身的資源包,替換損壞的文件,或者創建新的默認文件實現的.

下面我來說一說這種程序比較普通的一些做法:

首先在程序入口處,我們以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

發佈了22 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章