网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
用vc设计系统援救程序
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

一.引言
  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;  

 
  • 上一篇资讯: 谈在VC中动态改变菜单
  • 下一篇资讯: 用VC进行屏幕截取编程
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号