使用C ++合并.reg文件

时间:2010-02-23 16:47:56

标签: c++ c registry command-prompt

嘿,我只是尝试使用非常基本的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"); 

但他们的工作并没有好转。 非常有趣的是,如果我去Start,Run,并输入“regedit.exe new.reg” 注册表将更新;只是当我运行.exe程序时。 有什么想法吗?

1 个答案:

答案 0 :(得分: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;
            }
        }
    }
}