2010-02-23 130 views
2

嘿,我只是想使用非常基本的C++程序將.reg文件合併到我的註冊表中。使用C++來合併.reg文件

的代碼如下:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 
#include <stdlib.h> 
#include <cstdlib> 
#include <stdio.h> 
#include <windows.h> 

using namespace std; 

int main() 
{ 
    string file = "regedit.exe new.reg"; 
    const char* ctv = file.c_str(); 

    system(ctv); 

    system("PAUSE"); 

    return 0; 
} 

我也使用這些系統試圖命令:

ShellExecute(GetDesktopWindow(), "open", "new.reg", NULL, NULL, SW_SHOWNORMAL); 
system("reg import new.reg"); 
system("regedit/s new.reg"); 
system("new.reg"); 

但他們的工作沒有得到改善。 非常有趣的是,如果我去開始,運行,並輸入「regedit.exe new.reg」 註冊表將更新;只是不是當我運行.exe程序。 有什麼想法?

+0

重複:http://stackoverflow.com/questions/2300524/using-c- to-import-registry-files – dmeister 2010-02-23 16:51:01

+0

這需要在任何現代版本的Windows中提升權限。將所需的清單添加到您的程序中。 – 2010-02-23 19:42:19

回答

0

結賬programmatically merge .reg file into win32 registry另外還有import .reg files using win32 or other libraries

請參閱http://msdn.microsoft.com/en-us/library/ms724889%28VS.85%29.aspx以及哪些可能有所幫助。

RegLoadKey功能

創建HKEY_USERS或 HKEY_LOCAL_MACHINE下一個子項,並加載數據從指定的註冊表單元 成 該子項。

的應用程序備份或還原包括系統文件 和註冊表配置單元應使用 卷影複製服務,而不是 註冊表功能 系統狀態。

僅供參考,下面是它處理的進口鏈接開源項目的代碼段:

void CMainFrame::ImportRegistryFiles(CString csFileName) 
{ 
    CStdioFileEx sfRegFile; 
    TRY 
    { 
     sfRegFile.Open(LPCTSTR(csFileName),CFile::modeRead | CFile::typeText); 
    } 
    CATCH(CFileException, e) 
    { 
     CString csError = _T(""); 
     csError.Format(_T("File could not be opened: %s"), e->m_cause); 
     MessageBox(csError,_T("Import Error"), MB_OK|MB_ICONERROR); 
     return; 
    } 
    END_CATCH 

    CNtRegistry ntReg; 
    ntReg.InitNtRegistry(); 

    // 
    DWORD dwRegType = 0; 
    int nDataStarts = 0; 

    CTokenEx tok; 
    UCHAR ucData[8192]; 

    CString csValueName = _T(""); 
    CString csFullKey = _T(""); 
    CString csData = _T(""); 

    BOOL bNextLine = FALSE; 
    BOOL bKeyFound = FALSE; 
    BOOL bHiddenKey = FALSE; 

    CString csLine = _T(""); 
    while (sfRegFile.ReadString(csLine)) { 
     // 
     if (csLine.Left(3) == _T("[HK")) { 
      // 
      csLine.TrimLeft("["); 
      csLine.TrimRight("]"); 

      CStringArray csaKeyPath; 
      CString csFullPath = GetRegistryPath(csLine,csaKeyPath); 

      if (csFullPath.Right(1) == "*") { 
       // User wants to create a "Hidden" Key ... 
       bHiddenKey = TRUE; 
      } 

      if (!ntReg.KeyExists(csFullPath)) { 
       // 
       csFullKey = csaKeyPath.GetAt(0); 
       for (int n=1; n<csaKeyPath.GetSize(); n++) { 
        // 
        csFullKey += _T("\\"); 
        csFullKey += csaKeyPath.GetAt(n); 
        if (n == (csaKeyPath.GetSize()-1) && csFullKey.Right(1) == "*") { 
         CString csTmp = csFullKey; 
         csFullKey = csTmp.Left(csTmp.GetLength()-1); 
         if (!ntReg.CreateHiddenKey(csFullKey)) { 
          // 
          sfRegFile.Close(); 
          return; 
         } 
        } 
        else if (!ntReg.SetKey(csFullKey,TRUE,TRUE)) { 
         // 
         sfRegFile.Close(); 
         return; 
        } 
        theApp.m_clsTV->TraverseTree(csFullKey); 
       } 
      } 
      else { 
       // 
       if (!ntReg.SetKey(csFullPath,TRUE,TRUE)) { 
        // 
        sfRegFile.Close(); 
        return; 
       } 
       theApp.m_clsTV->TraverseTree(csFullKey); 
      } 
      bKeyFound = TRUE; 
      nDataStarts = 0; 
      dwRegType = REG_NONE; 
      csData = _T(""); 
     } 
     else if ((csLine.Left(2) == _T("@=") || 
       csLine.Left(1) == _T("=") || 
       csLine.Left(1) == _T("\"")) && 
       bKeyFound) { 
      // 
      memset(ucData,0,8192); 
      dwRegType = BreakdownLineInfo(csLine, csValueName, nDataStarts); 

#if _MSC_VER >= 1400 
      csLine.Trim();  // _VC80_ 
#else 
      csLine.TrimLeft(); 
      csLine.TrimRight(); 
#endif 
      csData = csLine.Mid(nDataStarts); 
      if (csLine.Right(1) == _T("\\")) { 
       bNextLine = TRUE; 
       csData.TrimRight(_T("\\")); 
      } 
      else { 
       // SetValue in Registry 
       bNextLine = FALSE; 
#if _MSC_VER >= 1400 
       csData.Trim();  // _VC80_ 
#else 
       csData.TrimLeft(); 
       csData.TrimRight(); 
#endif 
       csData.TrimRight(_T("\"")); 

       BOOL bError = FALSE; 
       switch (dwRegType) { 
        case REG_SZ: 
         bError = ntReg.WriteString(csFullKey,csValueName,csData); 
         break; 

        case REG_EXPAND_SZ: 
         // 
         { 
          CString csNewData = _T(""); 
          CString csTmpData = _T(""); 
          int nCtr = 0; 
          tok.Split(csData,_T(",")); 
          for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
           int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
           if (nDec != 0) { 
            csNewData.Format(_T("%c"),nDec); 
            csNewData += csTmpData; 
           } 
          } 
          bError = ntReg.WriteExpandString(csFullKey,csValueName,csNewData); 
         } 
         break; 

        case REG_DWORD: 
        case REG_DWORD_BIG_ENDIAN: 
         { 
          DWORD dwData = theApp.Hex2Dec(csData); 
          bError = ntReg.WriteDword(csFullKey,csValueName,dwData); 
         } 
         break; 

        case REG_MULTI_SZ: 
         // 
         { 
          CStringArray csaData; 
          CString csNewData = _T(""); 
          CString csTmpData = _T(""); 
          int nCtr = 0; 
          tok.Split(csData,_T(",")); 
          for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
           int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
           if (nDec != 0) { 
            csNewData.Format(_T("%c"),nDec); 
            csNewData += csTmpData; 
           } 
           else { 
            if ((n+1) < tok.m_csaAddIt.GetSize()) { 
             int nDec2 = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n+1)); 
             if (nDec2 == 0 && csNewData != _T("")) { 
              csaData.Add(csNewData); 
              csNewData = _T(""); 
             } 
            } 
           } 
          } 
          bError = ntReg.WriteMultiString(csFullKey,csValueName,csaData); 
         } 
         break; 

        case REG_BINARY: 
        case REG_LINK: 
        case REG_RESOURCE_LIST: 
        case REG_FULL_RESOURCE_DESCRIPTOR: 
        case REG_RESOURCE_REQUIREMENTS_LIST: 
        case REG_QWORD: 
         // 
         { 
          int nCtr = 0; 
          tok.Split(csData,_T(",")); 
          for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
           int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
           ucData[nCtr++] = nDec; 
          } 
          UINT uiLength = (UINT)nCtr+1; 
          bError = ntReg.WriteValue(csFullKey, csValueName, ucData, (ULONG)uiLength, dwRegType); 
         } 
         break; 
       } 
      } 
     } 
     else { 
      // 
      memset(ucData,0,8192); 
      if (bNextLine) { 
       // 
#if _MSC_VER >= 1400 
       csLine.Trim();  // _VC80_ 
#else 
       csLine.TrimLeft(); 
       csLine.TrimRight(); 
#endif 
       if (csLine.Right(1) != _T("\\")) { 
        // 
        bNextLine = FALSE; 
#if _MSC_VER >= 1400 
        csData.Trim();  // _VC80_ 
#else 
        csData.TrimLeft(); 
        csData.TrimRight(); 
#endif 
        csData.TrimRight(_T("\"")); 

        BOOL bError = FALSE; 
        csData += csLine; 

        // SetValue in Registry 
        switch (dwRegType) { 
         case REG_SZ: 
          bError = ntReg.WriteString(csFullKey,csValueName,csData); 
          break; 

         case REG_EXPAND_SZ: 
          // 
          { 
           CString csNewData = _T(""); 
           CString csTmpData = _T(""); 
           int nCtr = 0; 
           tok.Split(csData,_T(",")); 
           for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
            int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
            if (nDec != 0) { 
             csTmpData.Format(_T("%c"),nDec); 
             csNewData += csTmpData; 
            } 
           } 
           bError = ntReg.WriteExpandString(csFullKey,csValueName,csNewData); 
          } 
          break; 

         case REG_DWORD: 
         case REG_DWORD_BIG_ENDIAN: 
          { 
           DWORD dwData = theApp.Hex2Dec(csData); 
           bError = ntReg.WriteDword(csFullKey,csValueName,dwData); 
          } 
          break; 

         case REG_MULTI_SZ: 
          // 
          { 
           CStringArray csaData; 
           CString csNewData = _T(""); 
           CString csTmpData = _T(""); 
           int nCtr = 0; 
           tok.Split(csData,_T(",")); 
           for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
            int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
            if (nDec != 0) { 
             csTmpData.Format(_T("%c"),nDec); 
             csNewData += csTmpData; 
            } 
            else { 
             if ((n+1) < tok.m_csaAddIt.GetSize()) { 
              int nDec2 = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n+1)); 
              if (nDec2 == 0 && csNewData != _T("")) { 
               csaData.Add(csNewData); 
               csNewData = _T(""); 
              } 
             } 
            } 
           } 
           bError = ntReg.WriteMultiString(csFullKey,csValueName,csaData); 
          } 
          break; 

         case REG_BINARY: 
         case REG_LINK: 
         case REG_RESOURCE_LIST: 
         case REG_FULL_RESOURCE_DESCRIPTOR: 
         case REG_RESOURCE_REQUIREMENTS_LIST: 
         case REG_QWORD: 
          // 
          { 
           int nCtr = 0; 
           tok.Split(csData,_T(",")); 
           for (int n=0; n<tok.m_csaAddIt.GetSize(); n++) { 
            int nDec = theApp.Hex2Dec(tok.m_csaAddIt.GetAt(n)); 
            ucData[nCtr++] = nDec; 
           } 
           UINT uiLength = (UINT)nCtr+1; 
           bError = ntReg.WriteValue(csFullKey, csValueName, ucData, (ULONG)uiLength, dwRegType); 
          } 
          break; 
        } 
       } 
       else { 
        csData += csLine; 
#if _MSC_VER >= 1400 
        csLine.Trim();  // _VC80_ 
#else 
        csLine.TrimLeft(); 
        csLine.TrimRight(); 
#endif 
        csData.TrimRight(_T("\\")); 
       } 
      } 
      else { 
       bKeyFound = FALSE; 
      } 
     } 
    } 
} 
+0

感謝您的鏈接,但他們都沒有給予太多幫助; 第一個詳細的API函數,提到'regedit.exe「mytest.reg」',我已經測試過,第二個只是真的提供了Google搜索的建議..我已經完成了。 – 2010-02-23 17:02:14

+0

你有看過MSDNAA API鏈接嗎?如果他們也提供了一個具體的例子,那將會很好。我可以建議的是找到一些開源的reg編輯器,並從中修改代碼。 http://www.codeproject.com/KB/applications/NtRegEdit.aspx – 2010-02-23 17:29:34

+0

我發現一個簡單的方法來通過VB來做到這一點。不過,感謝您的幫助。 – 2010-02-23 17:36:47