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