很多時候,我們可能要将某些檔案打包到資源中,然後當程式執行的時候,發現缺少某些檔案時,進行自我修複,以維持程式的正常執行,
很多安裝程式或者比較進階點的智能程式都已經這樣做,比如檔案損壞時,安裝程式将修複這些檔案.一些進階程式的常用設定及檔案
遇到破壞時,也會自我修複,它們的這些神奇功能,全都是依靠自身的資源包,替換損壞的檔案,或者建立新的預設檔案實作的.
下面我來說一說這種程式比較普通的一些做法:
首先在程式入口處,我們以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