• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用vc設計系統援救程序

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    一.引言 Windows 的system.dat和user.dat中存儲著windows注冊表,win.ini和system.ini中也存儲著一些重要的初始化信息,對它們進行備份可以避免一些重裝系統之類的繁瑣.雖然windos自帶一些備份和恢復系統信息的功能,但是使用起來很不方便.經過一些研究,我發現
    一.引言
      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();

      f2.Close();  

      m_savedNum++;

      DeleteFile(toShortPath(m_strWinDir)+"\\sysbckup\\rb000.cab");  

      CStdioFile f;    //建立包含系統備份命令的批處理文件并執行.

      f.Open(getMyDir()+"myTemp.bat", CFile::modeCreate|CFile::modeWrite,NULL);

      CString m_strCommand=toShortPath(m_strWinDir)+"\\command\\scanreg.exe/backup\n";

      f.WriteString(m_strCommand);

      f.Close();

      WinExec(getMyDir()+"myTemp.bat",SW_HIDE);

      CString m_toRbName;

      m_toRbName.Format("rb0%d.cab", m_savedNum);     //格式化存儲文件名.

      CTime m_beginTime=CTime::GetCurrentTime();

      CTimeSpan m_timeSpan=CTime::GetCurrentTime()-m_beginTime;

      SYSTEM_INFO sysInfo;

      GetSystemInfo(&sysInfo);

      int delayTime=150/sysInfo.wProcessorLevel;     //根據計算機的速度算出大致的完成時間.

      while(!CopyFile(m_strWinDir+"\\sysbckup\\rb000.cab",getMyDir()+m_toRbName,0))

      {

        MSG msg;

        if(::PeekMessage(&msg,m_hWnd,0,0,PM_REMOVE))

        {

          ::TranslateMessage(&msg);

          ::DispatchMessage(&msg);

        }

        if(!(m_progress.GetPos()>=100))

          m_progress.SetPos(100*m_timeSpan.GetSeconds()/delayTime);

        m_timeSpan=CTime::GetCurrentTime()-m_beginTime;

      }

      m_progress.SetPos(100);

      AfxMessageBox("已經成功的備份了系統文件");

      DeleteFile(getMyDir()+"myTemp.bat");

      }

      6.為"開始恢復"按鈕或菜單項生成一個響應函數:

      void CRescueSysDlg::OnBeginRestore()

      {

      CRestoreDlg m_restoreDlg;

      // CRestoreDlg是一個對話框類,用來將用戶輸入的恢復名稱保存在m_restoreDlg.m_strSeled中.

      if(IDCANCEL==m_restoreDlg.DoModal())

        return;

      CStdioFile f;       //建立Autoexec.bat和rescueS.bat,將恢復系統的命令寫入.

      f.Open(getMyDir()+"Autoexec.bat", CFile::modeCreate|CFile::modeWrite,NULL);

      CString m_strCommand=(CString)"echo off \n"+"cls \n"+

        toShortPath(getMyDir())+"rescueS.bat \n";

      f.WriteString(m_strCommand);

      f.Close();

      f.Open(getMyDir()+"rescueS.bat", CFile::modeCreate|CFile::modeWrite,NULL);

      m_strCommand=(CString)"echo off \n"+"cls \n"+

        "del "+toShortPath(m_strWinDir)+"\\sysbckup\\*.cab\n"+

        "copy "+toShortPath(getMyDir())+m_restoreDlg.m_strSeled+" "+toShortPath(m_strWinDir) +"\\sysbckup\\rb000.cab \n"+

        "copy "+toShortPath(getMyDir())+"Autoexec.bak c:\\Autoexec.bat /Y \n"+

        toShortPath(m_strWinDir)+"\\command\\scanreg.exe/restore";

      f.WriteString(m_strCommand);

      f.Close();

      CopyFile(getMyDir()+"Autoexec.bak","c:\\Autoexec.bat",0);

      CopyFile("c:\\Autoexec.bat",getMyDir()+"Autoexec.bak",0);

      CopyFile(getMyDir()+"Autoexec.bat","c:\\Autoexec.bat",0);

      if(IDCANCEL==AfxMessageBox("必須重啟才能生效,你想現在重啟嗎?",MB_OKCANCEL))

        return;

      else

        ExitWindowsEx(EWX_REBOOT,NULL);

      }

      7.為"創建援救盤"按鈕或菜單項生成一個響應函數:

      void CRescueSysDlg::OnCreatea()

      {

      if(IDCANCEL==AfxMessageBox("請插入一張軟盤,然后按確定鍵.\n\n注意:軟盤上的所有內容將被刪除.",MB_OKCANCEL))

        return;

      CStdioFile f;         //建立包含建立啟動盤的命令的批處理文件并執行.

      f.Open(getMyDir()+"myTemp.bat", CFile::modeCreate|CFile::modeWrite,NULL);

      CString m_strCommand=toShortPath(m_strWinDir)+"\\command\\deltree /Y a:\\ \n"+

        toShortPath(m_strWinDir)+"\\command\\sys c: a:\n"+

        "dir "+getMyDir()+"rescueSys.exe >> "+getMyDir()+"abcdefgh.txt";

      f.WriteString(m_strCommand);

      f.Close();

      WinExec(getMyDir()+"myTemp.bat",SW_HIDE);  

      CTime m_beginTime=CTime::GetCurrentTime();

      CTimeSpan m_timeSpan=CTime::GetCurrentTime()-m_beginTime;

      CFileFind finder;

      while(!finder.FindFile(getMyDir()+"abcdefgh.txt"))

      //如果找到了abcdefgh.txt則說明批處理已經執行完畢.

      {

        MSG msg;

        if(::PeekMessage(&msg,m_hWnd,0,0,PM_REMOVE))

        {

          ::TranslateMessage(&msg);

          ::DispatchMessage(&msg);

        }

        if(!(m_progress.GetPos()>=100))

          m_progress.SetPos(100*m_timeSpan.GetSeconds()/30);

        m_timeSpan=CTime::GetCurrentTime()-m_beginTime;

      }

      m_progress.SetPos(100);

      f.Open("a:\\autoexec.bat", CFile::modeCreate|CFile::modeWrite,NULL);

      m_strCommand=(CString)"echo off \n"+"cls \n"+

        "copy "+toShortPath(getMyDir())+"*.cab "+toShortPath(m_strWinDir)+"\\sysbckup /Y \n"+

        toShortPath(m_strWinDir)+"\\command\\scanreg.exe/restore \n";

      f.WriteString(m_strCommand);

      f.Close();

      AfxMessageBox("已經成功的創建了援救盤.");  

      DeleteFile(getMyDir()+"myTemp.bat");

      DeleteFile(getMyDir()+"abcdefgh.txt");

      }


      摘自《賽迪網》 聶棟棟/文

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>