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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2022-03-19 halcon-gen_ellipse_contour_xld创建椭圆弧的XLD轮廓