天天看點

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