用vc设计系统援救程式
2008-02-23 05:29:27来源:互联网 阅读 ()
一.引言 Windows的system.dat和user.dat中存储着windows注册表,win.ini和system.ini中也存储着一些重要的初始化信息,对他们进行备份能够避免一些重装系统之类的繁琐.虽然windos自带一些备份和恢复系统信息的功能,但是使用起来很不方便.经过一些研究,我发现您完万能够很容易地设计出自己的系统援救程式. 二.关键问题分析 1.在程式中调用系统现有的程式. 使用WinExec(),ShellExecute(),CreateProcess()调用其他应用程式的这三种方法基本已人所共知.但是有一些命令和程式他们不能调用,如DOS中的内部命令和sys.com等一些外部命令.这时,我们能够首先建立一个.bat的批处理文档,然后再用这三种方法之一采用隐藏的方式来调用这个批处理文档.这样我们能够在用户不知不觉中,来使用一些系统现成的功能. 2.如何备份系统信息 能够调用windows目录下command\目录中的scanreg.exe来备份系统信息,用/backup参数能够使前面介绍的文档被压缩成一个cab文档存储于windows目录下的sysbckup\目录中,文档名自动为rb000,rb001等.此命令不能直接调用,必须通过前面介绍的方法来使用他.假如您不想使用scanreg.exe,也能够使用同一个目录中的extract.exe来生成cab文档,这样虽然麻烦一些,但是灵活性较强. 注意,为了程式的通用性, windows目录不应根据您的电脑上的目录直接指定,而应使用GetWindowsDirectory()来获得. 3.如何恢复系统信息 注册表文档的恢复必须在纯DOS方式下,因此您的程式应让系统重启(使用ExitWindowsEx()),在没进入windows之前恢复系统信息.这能够通过修改autoexec.bat来实现.假如在备份时您使用的是scanreg /backup,那么在恢复时您能够在autoexec.bat中加入scanreg /restore.假如您备份时使用的是extract 那么您能够将形式如下的一条语句加入到autoexec.bat中: extract /Y /L C:\windows myBackedFile.cab *.* 另外除特别情况外,在纯DOS方式下一般不支持长路径名.因此在程式中将语句写入autoexec.bat时,要先用GetShortPathName()来转化为短路径名. 4.援救盘的创建 恢复系统可分两种情况.一种是用户想把系统信息恢复成以前某次备份时的状态,此时可使用户在程式中选择要恢复的备份,然后程式控制重启并在autoexec.bat中恢复即可.另一种情况则是用户由于误操作或其他原因是系统出错而不能进入windows,因此要建立援救软盘,以使用户能够恢复系统.援救盘的目的一个是启动系统,能够通过windows目录下command\目录中的sys.com来实现(如sys c: a:).另外软盘重要记住备份存放的位置,以便通过命令来恢复系统. 三.程式实现 1.在头文档中加入: CString m_strWinDir(' ',_MAX_DIR); 2.在构造函数中加入: GetWindowsDirectory(m_strWinDir.GetBuffer(0),_MAX_DIR); m_strWinDir.ReleaseBuffer(); 3.加入一个进展条,并用ClassWazid生成一个控制型变量m_progress. 4.加入两个函数: CString CRescueSysDlg::getMyDir() //用来得到程式的当前目录. { TCHAR sFilename[_MAX_PATH]; TCHAR sDrive[_MAX_DRIVE]; TCHAR sDir[_MAX_DIR]; TCHAR sFname[_MAX_FNAME]; //不带扩展名 TCHAR sExt[_MAX_EXT]; //扩展名,前面有"." GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); _tsplitpath(sFilename, sDrive, sDir, sFname, sExt); CString homeDir(CString(sDrive) CString(sDir)); int nLen=homeDir.GetLength(); if (homeDir.GetAt(nLen-1) != _T('\\')) homeDir =_T("\\"); return homeDir; } CString CRescueSysDlg::toShortPath(CString m_inDir) //用来将长路径名转化为短路径名. { char strBuffer[_MAX_PATH]; GetShortPathName(m_inDir,strBuffer,_MAX_PATH); CString m_toDir(strBuffer); return m_toDir; } 5.为"开始备份"按钮或菜单项生成一个响应函数: void CRescueSysDlg::OnBeginBkup() { CInputName m_inNameDlg; // CinputName是个对话框类,用来将用户输入的备份名称保存在inNameDlg .m_strInputEdit中. if(IDCANCEL==m_inNameDlg.DoModal()) return; CFile f1; CString m_allFileName[20]; int m_savedNum=0; if(f1.Open(getMyDir() "backedCab.mqy",CFile::modeRead)) //读出用户以前任何备份的名称. { CArchive ar1(&f1,CArchive::load); ar1>>m_savedNum; for(int i=0;i ar1>>m_allFileName[i]; ar1.Close(); f1.Close(); } CTime m_curTime=CTime::GetCurrentTime(); CString strInputAdded,strIsFileName; strInputAdded.Format("_%d_%d_%d_%d_%d",m_curTime.GetYear(),m_curTime.GetMonth(), m_curTime.GetDay(),m_curTime.GetHour(),m_curTime.GetMinute()); strIsFileName=m_inNameDlg.m_strInputEdit strInputAdded; CFile f2; f2.Open(getMyDir() "backedCab.mqy",CFile::modeCreate|CFile::modeWrite); CArchive ar2(&f2,CArchive::store); ar2< for(int j=0;j ar2< ar2< ar2.Close(); 标签: 版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 上一篇: 在Visual C 中使用fopen()函数来读写文档 下一篇: C语言高效编程的的四招技巧(1)
相关文章
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设 网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源 网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash 热门词条
最新资讯
热门关注
热门标签
|