| 一.引言 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();
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |
用vc设计系统援救程式
来源:互联网
作者:west263.com
时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!



