VC实现将资源打包并释放到指定文件夹
作者:admin 日期:2010-05-26
很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行,
很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件
遇到破坏时, 也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.
下面我来说一说这种程序比较普通的一些做法:
首先在程序入口处,我们以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文件,然后执行,再把自身销毁,这个时候杀毒程序警告我,这是一个病毒,
哈哈,可能病毒就是这样的搞的.那么你还等什么,赶快试试吧.
很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件
遇到破坏时, 也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.
下面我来说一说这种程序比较普通的一些做法:
首先在程序入口处,我们以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文件,然后执行,再把自身销毁,这个时候杀毒程序警告我,这是一个病毒,
哈哈,可能病毒就是这样的搞的.那么你还等什么,赶快试试吧.
评论: 0 | 查看次数: 8976