MFC-注册表

 键值类型

            REG_SZ=1
            REG_MULTI_SZ=7
            REG_BINARY=3
            REG_DWORD=4        

 

 

 

打开注册表键 

复制代码
    HKEY phkResult=NULL;

    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_WOW64_64KEY | KEY_READ, &phkResult);//打开注册表键
    /*
    参数1:HKEY hKey          需要打开的主键的名称
            HKEY_CLASSES_ROOT
            HKEY_CURRENT_USER
            HKEY_LOCAL_MACHINE
            HKEY_USERS
            HKEY_CURRENT_CONFIG
    参数2:LPCTSTR lpSubKey   需要打开的子键的名称
            以null结尾的字符串指针,包含要打开的注册表子项的名称。如果参数设置为NULL 或者指向一个空字符串,该函数将打开由hKey参数标识的键的新句柄。这种情况下,函数不会关闭先前已经打开的句柄
            注意:\\ 
    参数3:DWORD ulOptions    保留,设为0
    参数4:REGSAM samDesired  安全访问标记,也就是权限
            KEY_ALL_ACCESS=0xF003F   包含所有权限
            
    参数5:PHKEY phkResult    保存打开键的句柄
            指向一个接收到打开的键的句柄的变量的指针。当您不再需要返回的句柄时,调用RegCloseKey函数来关闭它
    返回值:如果函数调用成功,则返回0(ERROR_SUCCESS)。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码
            错误代码可以通过 菜单栏-->工具-->错误查找    查看发生错误的原因
  【注意:必须以管理员身份运行】
    */


    if (L== ERROR_SUCCESS)
    {
        AfxMessageBox(_T("打开成功"));
    }
复制代码

注意容易发生的错误:

  64位机制  x86环境下   必须用KEY_WOW64_64KEY  

  

错误代码查询:

  菜单栏-->工具--> 错误查找

  

释放注册键句柄 

    LONG LL = ::RegCloseKey(phkResult); //释放注册键句柄
    //参数:HKEY hKey 释放键的句柄
    //返回值: 如果过程执行成功,返回值是 ERROR_SUCCESS。如果功能失败,返回一个非零值,错误码在 Winerror.h 定义

创建或打开子键 

复制代码
    HKEY phkResult = NULL;
    DWORD lpdw;

    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_ALL_ACCESS, &phkResult);

    LONG LL=RegCreateKeyEx(phkResult,_T("liming"),0,NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS,NULL, &phkResult, &lpdw);//创建或打开子键
    /*
    如果新键不存在就创建,如果新键已经存在就打开, [可以创建n深层的子键]
    参数1:HKEY  一个打开键的句柄。调用该函数的进程必须拥有KEY_CREATE_SUB_KEY的权力。该句柄可以是RegCreateKeyEx或者RegOpenKeyEx的返回值,也可以是以下预定义的值
                HKEY_CLASSES_ROOT
                 HKEY_CURRENT_CONFIG
                HKEY_CURRENT_USER
                HKEY_LOCAL_MACHINE
                HKEY_USERS
    参数2:标识子键名称。该参数不能为空。参数中不能存在(/)
    参数3:保留值,必须为0
    参数4:指向一个字符串,该字符串定义了该键的类型
    参数5: REG_OPTION_NON_VOLATILE
            REG_OPTION_VOLATILE              一般使用该值(保存新键)
            REG_OPTION_BACKUP_RESTORE
    参数6:指定对密钥的期望访问权限
            [看上面]
    参数7:一个SECURITY_ATTRIBUTES结构的指针,该结构确定返回的句柄是否可以被子进程继承。如果为NULL,则不能继承该句柄
    参数8:PHKEY 保存返回的句柄
    参数9:LPDWORD  保存新键之前是否存在;可以为NULL
            REG_CREATED_NEW_KEY=0x00000001L        该键是新创建的键
             REG_OPENED_EXISTING_KEY=0x00000002L   该键是已经存在的键
    返回值:如果函数成功,返回值为ERROR_SUCCESS。如果函数失败,返回值是Winerror.h中定义的非零错误代码

    */


    if(LL== ERROR_SUCCESS)
    {
        CString str;
        str.Format(_T("LL=%d"),LL);
        ::OutputDebugString(str);

    }
复制代码

删除注册表键 

复制代码
    HKEY phkResult = NULL;
    
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_ALL_ACCESS, &phkResult);

    LONG LL=RegDeleteKey(phkResult, _T("liming")); //删除注册表键
    /*
    参数1:HKEY  键的句柄
           可以使用下列的常量:
            HKEY_CLASSES_ROOT
            HKEY_CURRENT_CONFIG
            HKEY_CURRENT_USER
            HKEY_LOCAL_MACHINE
            HKEY_USERS
    参数2:LPCTSTR  被删除的键名称
            键值的名称不区分大小写
    返回值:如果函数成功,返回值是ERROR_SUCCESS。如果函数失败,返回值是非零错误代码定义在 Winerror.h
    说明:函数仅删除最后一层子键以及下面的全部键值项

    */
复制代码

 

RegQueryInfoKey获取子键和键值的信息 

复制代码
    HKEY phkResult = NULL;
    DWORD num = 100;
    DWORD len = 0;
    DWORD num1 = 0;
    DWORD mingcen = 0;
    DWORD suju = 0;
    

    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);

    L=RegQueryInfoKey(phkResult, NULL, NULL,NULL,&num,&len,NULL,&num1,&mingcen,&suju, NULL,NULL);//获取键的信息
    /*
    参数1:HKEY   打开的注册表项的句柄。 密钥必须已使用KEY_QUERY_VALUE访问权限打开
    参数2:LPWSTR,指定一个字串,用于装载这个注册表项的类名,一般为NULL
    参数3:LPDWORD,指定一个变量,用于装载参数2缓冲区的长度。一旦返回,它会设为实际装载到缓冲区的字节数量,一般为NULL
    参数4:LPDWORD,未用,设为NULL
    参数5:LPDWORD,用于保存直接子键数量的一个变量
    参数6:LPDWORD,指定一个变量,用于装载这个项最长一个子键的长度。注意这个长度不包括空中止字符
    参数7:LPDWORD,指定一个变量,用于装载这个项之子键的最长一个类名的长度。注意这个长度不包括空中止字符,一般为NULL
    参数8:LPDWORD,用于保存键值的数量(不包括默认),可以为NULL
    参数9:LPDWORD,指定一个变量,用于保存最长一个键值名称的长度。注意这个长度不包括空中止字符,可以为NULL
    参数10:LPDWORD,指定一个变量,用于保存这个项最长一个键值数据长度
    参数11:LPDWORD,保存安全描述符长度的一个变量,一般为NULL
    参数12:FILETIME,指定一个结构,用于保存该项的上一次修改时间,可以为NULL

    返回值:Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。
               如一个缓冲区的长度不够,不能容下返回的数据,则函数会返回ERROR_MORE_DATA

    */
复制代码

 

RegEnumKeyEx枚举子键 

复制代码
    HKEY phkResult = NULL;
    DWORD num = 0; //保存子键的数量
    DWORD len = 0;
    
    
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);
    L = RegQueryInfoKey(phkResult, NULL, NULL, NULL, &num, &len, NULL, NULL, NULL, NULL, NULL, NULL);
    
    DWORD namelen = len + 1;
    TCHAR* name = new TCHAR[namelen];
    

    for (int i=0;i<num;i++)
    {
        namelen = len + 1;
        //原因:每次RegEnumKeyEx之后会更改namelen的值,所以每次重新赋值
        ZeroMemory(name, namelen);//清零
        RegEnumKeyEx(phkResult, i,name, &namelen,NULL,NULL,NULL,NULL);//枚举子键
    /*
    参数1:HKEY  打开的注册表项的句柄。 必须已使用KEY_ENUMERATE_SUB_KEYS访问权限打开密钥
            此句柄由 RegCreateKeyEx、 RegCreateKeyTransacted、 RegOpenKeyEx 或 RegOpenKeyTransacted 函数返回。 也可以是以下 预定义键之一:
            HKEY_CLASSES_ROOT
            HKEY_CURRENT_CONFIG
            HKEY_CURRENT_USER
            HKEY_LOCAL_MACHINE
            HKEY_PERFORMANCE_DATA
            HKEY_USERS
    参数2:DWORD   要检索的子键的索引
    参数3:LPSTR   指向接收子键名称(包括终止 null 字符)的缓冲区的指针。 函数仅将子键的名称(而不是完整键层次结构)复制到缓冲区。
                    如果函数失败,则不会将任何信息复制到此缓冲区
    参数4:LPDWORD   指向变量的指针,该变量指定 由参数3指定的缓冲区的大小(以字符为单位)。 此大小应包含终止 null 字符
                    如果函数成功,该变量包含缓冲区中存储的字符数,不包括终止 null 字符
    参数5:此参数是保留的,必须为 NULL
    参数6:指向接收枚举子键的用户定义类的缓冲区的指针。 此参数可以为 NULL
    参数7:指向变量的指针,该变量指定 由 lpClass 参数指定的缓冲区的大小(以字符为单位)。 大小应包括终止 null 字符。 
            如果函数成功, 则参数6包含缓冲区中存储的字符数,不包括终止 null 字符。 仅当参数 6为 NULL 时,此参数才能为 NULL
    参数8:指向 FILETIME 结构的指针,该结构接收上次写入枚举子键的时间。 此参数可以为 NULL

    返回值:如果函数成功,则返回值为 ERROR_SUCCESS。
            如果函数失败,则返回值为 系统错误代码。 如果没有其他可用的子键,函数将返回ERROR_NO_MORE_ITEMS。
            如果参数3缓冲区太小而无法接收密钥的名称,则函数将返回ERROR_MORE_DATA

    */

    ::OutputDebugString(name);
    ::OutputDebugString(_T("\r\n"));
    

    }
    
    delete[] name;
    RegCloseKey(phkResult); //关闭注册表句柄
    //参数:注册表句柄
复制代码

 

关闭注册表句柄

RegCloseKey(phkResult); //关闭注册表句柄
    //参数:注册表句柄

 

获取键值信息 

复制代码
    //获取键值信息
    DWORD type=0;
    
    DWORD size = 0;

    HKEY phkResult = NULL;
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);
    RegQueryValueEx(phkResult,_T("sisi"),NULL,NULL,NULL,&size);
    //说明:参数5为NULL,目的获取所需缓冲区大小

    BYTE* data = new BYTE[size];

    RegQueryValueEx(phkResult,_T("sisi"),NULL,&type,data, &size);  //获取指定键值名称的键值类型和键值数据
    /*
    参数1:HKEY   当前打开的密钥或以下预定义密钥之一的句柄:
    HKEY_CLASSES_ROOT
    HKEY_CURRENT_CONFIG
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS
    Windows NT/2000/XP: HKEY_PERFORMANCE_DATA
    Windows XP: HKEY_PERFORMANCE_TEXT
    HKEY_PERFORMANCE_NLSTEXT
    Windows 95/98/Me: HKEY_DYN_DATA

    参数2:LPCTSTR  指向一个以null结尾的字符串的指针,该字符串输入键值的名称。
            
    参数3:LPDWORD   保留;必须为NULL
    参数4:LPDWORD   指向一个变量的指针,该变量保存键值类型的代码。如果不需要类型代码,可以为NULL
            注册表类型看:https://zhidao.baidu.com/question/754581210868375332.html  
            REG_SZ=1
            REG_MULTI_SZ=7
            REG_BINARY=3
            REG_DWORD=4

    参数5:LPBYTE    指向接收键值数据的缓冲区的指针。如果不需要数据,此参数可以为空
    参数6:LPDWORD   指向一个变量的指针,该变量指定参数5指向的缓冲区的大小(以字节为单位)。当函数返回时,该变量包含复制到参数5的数据的大小
                    如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,那么参数6也将包含终止null字符或字符的大小。
                    只有当参数5为空时,参数6才可以为NULL。
                    如果参数5指定的缓冲区不够大,无法容纳数据,则函数返回值ERROR_MORE_DATA,并将所需的缓冲区大小(以字节为单位)存储到参数6指向的变量中。在这种情况下,缓冲区的内容没有定义
                    如果参数5是NULL,并且参数6是非NULL,那么函数将返回ERROR_SUCCESS,并在参数6指向的变量中存储数据的大小(以字节为单位)。这让应用程序确定为值的数据分配缓冲区的最佳方法

    返回值:如果函数成功,返回值为ERROR_SUCCESS。
            如果函数失败,返回值是Winerror.h中定义的非零错误代码。您可以使用FormatMessage函数和FORMAT_MESSAGE_FROM_SYSTEM标志来获得错误的通用描述

    */


    CString str;
    str.Format(_T("data=%s\r\n"),data);
    ::OutputDebugString(str);


    delete[] data;
    RegCloseKey(phkResult);
复制代码

 

设置键值信息 

复制代码
    HKEY phkResult = NULL;
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm\\liming"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);

    CString data = _T("abcdef");


    RegSetValueEx(phkResult,_T("wowo"),0, REG_SZ,(LPBYTE)data.GetBuffer(),data.GetLength()*sizeof(TCHAR)); //设置指定键值名称的键值类型和键值数据
    /*
    参数1:HKEY   当前打开的密钥或以下预定义密钥之一的句柄:
    HKEY_CLASSES_ROOT
    HKEY_CURRENT_CONFIG
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS
    Windows NT/2000/XP: HKEY_PERFORMANCE_DATA
    Windows XP: HKEY_PERFORMANCE_TEXT
    HKEY_PERFORMANCE_NLSTEXT
    Windows 95/98/Me: HKEY_DYN_DATA

    参数2:LPCTSTR 要修改的键值名称,如果键值名称不存在,函数将其添加到键中。
            如果是NULL或空字符串"",函数将为键的未命名或默认值设置类型和数据
    参数3: DWORD  保留;必须是零
    参数4:DWORD  数据类型的代码
    参数5:CONST BYTE*  指向一个缓冲区的指针,键值数据
            对于基于字符串的数据类型,如REG_SZ,字符串必须为空终止。对于REG_MULTI_SZ数据类型,字符串必须以双null结尾
    参数6:DWORD  缓冲区的大小(以字节为单位)。
            如果数据类型为REG_SZ、REG_EXPAND_SZ或REG_MULTI_SZ,则必须包括终止null字符或字符的大小

    
    */


    RegCloseKey(phkResult);
复制代码

 

删除键值

复制代码
    HKEY phkResult = NULL;
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm\\liming"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);

    RegDeleteValue(phkResult,_T("wowo"));//删除键值
    /*
    参数1:HKEY   当前打开的句柄
    参数2:LPCTSTR  键值名称,如果为空字符或NULL,将删除由RegSetValue创建的值
    返回值: 成功返回ERROR_SUCCESS ,失败返回一个非零值


    */

    RegCloseKey(phkResult);
复制代码

 

枚举键值 

复制代码
    HKEY phkResult = NULL;
    LONG L = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\lm\\liming"), 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &phkResult);

    DWORD num1 = 0;//键值数量
    DWORD mingcen = 0;//最长键值名称长度
    DWORD suju = 0;//最长键值数据长度

    RegQueryInfoKey(phkResult,NULL,NULL,NULL,NULL,NULL,NULL, &num1, &mingcen, &suju,NULL,NULL);
    DWORD mingcenlen = mingcen + 2;
    TCHAR* pname = new TCHAR[mingcenlen]; //保存键值名称
    DWORD sujulen = suju + 2;
    BYTE* pdata = new BYTE[sujulen];   //接收键值数据
    DWORD type = 0;     //接受数据类型

    CString strname, strdata;

    for (DWORD index = 0; index < num1;index++) {
        mingcenlen = mingcen + 2;
        ZeroMemory(pname, mingcenlen);//清零
        sujulen = suju + 2;
        ZeroMemory(pdata, sujulen);

        LONG lResult=RegEnumValue(phkResult, index, pname, &mingcenlen,NULL,&type, pdata, &sujulen); //获取键值
    /*
    参数1:HKEY 打开的注册表项的句柄
            此句柄由 RegCreateKeyEx、RegCreateKeyTransacted、RegOpenKeyEx 或 RegOpenKeyTransacted 函数返回。 它也可以是以下 预定义键之一:
            HKEY_CLASSES_ROOT
            HKEY_CURRENT_CONFIG
            HKEY_CURRENT_USER
            HKEY_LOCAL_MACHINE
            HKEY_PERFORMANCE_DATA
            HKEY_USERS
    参数2:DWORD  要检索的值的索引。 对于对 RegEnumValue 函数的第一次调用,此参数应为零,然后为后续调用递增。
            由于值没有排序,因此任何新值都将具有任意索引。 这意味着函数可以按任意顺序返回值
    参数3:LPSTR  指向一个缓冲区的指针,该缓冲区以 null 结尾的字符串接收键值名称
            此缓冲区必须足够大,才能包含终止 null 字符
    参数4:LPDWORD  指向一个变量的指针,该变量指定参数3所指向的缓冲区的大小(以字符为单位)。
            函数返回时,变量接收存储在缓冲区中的字符数,不包括终止 null 字符
            如果参数3指定的缓冲区不够大,无法保存数据,则函数将返回ERROR_MORE_DATA, 并且参数3指向的变量中的缓冲区大小不会更改。
            在这种情况下,参数4的内容是未定义的
    参数5:此参数是保留的,必须为 NULL
    参数6:LPDWORD  指向一个变量的指针,该变量接收一个代码,指示存储在指定值中的数据的类型。
            如果不需要类型代码, 则参数6可以为 NULL
    参数7:LPBYTE  指向接收键值数据的缓冲区的指针。 如果不需要数据,此参数可以为 NULL
            如果参数7为 NULL 且参数8为非 NULL,则函数将数据存储所需的大小(以字节为单位)存储在参数8指向的变量中。 这使应用程序能够确定为数据分配缓冲区的最佳方法
    参数8:LPDWORD  指向一个变量的指针,该变量指定参数7指向的缓冲区的大小(以字节为单位)。
                当函数返回时,变量将接收存储在缓冲区中的字节数
                仅当参数7为 NULL 时,此参数才能为 NULL
                如果参数7指定的缓冲区不够大,无法保存数据,该函数将返回ERROR_MORE_DATA,并将所需的缓冲区大小存储在 由参数7指向的变量中。 在这种情况下,参数7的内容未定义
    返回值:如果函数成功,则返回值为 ERROR_SUCCESS=0L。
            如果函数失败,则返回值为 系统错误代码。
            如果没有可用的值,该函数将返回ERROR_NO_MORE_ITEMS=259L。
            如果参数3或参数7指定的缓冲区太小,无法接收值,则函数将返回ERROR_MORE_DATA

    */

        strname.Format(_T("name=%s   "), pname);
        ::OutputDebugString(strname);
        strdata.Format(_T("data=%s\r\n"), pdata);
        ::OutputDebugString(strdata);


    }

    delete[] pname;
    delete[] pdata;
    RegCloseKey(phkResult);
复制代码

以上实例工程下载:

链接:https://pan.baidu.com/s/1q5wpLAD9AfXLitX5Fghyhg    提取码:6666  

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(219)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-03-19 halcon-gen_ellipse_contour_xld创建椭圆弧的XLD轮廓
点击右上角即可分享
微信分享提示

目录导航