详解常用的注册表操作函数
参数说明:
HKEY hKey 已经打开的键的句柄
DWORD dwIndex
子键的索引,从 0 开始。 LPTSTR lpName
指向保存子
键名的缓冲区的字符指针。注意仅是该子键的名,不包括其层次结构。
DWORD cbName 表示 lpName 指向的缓冲区的大小
返回值:
成功返回 ERROR_SUCCESS,失败放回非零值。
LPCTSTR lpSubKey 表示以 NULL 结尾的字符串指针。该字符串中保存了要创建的 子键的名称和结构。如要在 HKEY_CLASSES_ROOT 的根键下创建一个名为“pro”的子键, 直接为用“pro”。如果要在 pro 下面在创建一个 subpro1。则赋值”pro\\subpro1“。注意:键名 与键名之间用两个下斜杠,这样表示转义;创建 subpro1 子键的时候并不要求 pro 子键已经 存在。如果不存在就一并创建了。
参数说明:
HKEY hKey
根键名或已经打开的键的句柄(注意那本函数没有 LPCTSTR lpSubKey 来
指定子键名,所以 hKey 必须是打开该子键的句柄)
LPCTSTR lpValueName 键值的名称 NULL 表示默认键值。
DWORD Reserved 保留,必须赋值 0.
DWORD dwType 键值的类型,具体见下面的键值类型表。
hKey 用根键名,lpSubKey 指定要删除的键。这样无论该键是否打开都可以删除。 返回值: 成功返回 ERROR_SUCCESS,失败放回非零值。 说明: 本函数仅能够删除没有子键的键。删除时键中的所有键值将一并删除。
LONG RegDeleteKeyEx( HKEY hKey, LPCTSTR lpSubKey, REGSAM samDesired, DWORD
PFILETIME lpftLastWriteTime
);
参数说明:
HKEY hKey 已经打开的键的句柄
DWORD dwIndex
子键的索引,从 0 开始。 LPTSTR lpName
指向保存子
键名的缓冲区的字符指针。注意仅是该子键的名,不包括其层次结构。
LPDWORD lpcbName 本参数既是入参也是出参,输入 lpName 指向的缓冲区大小,函数
Reserved );
参数说明:
前两个参数同 RegDeleteKey()
REGSAM samDesired:本参数有两个指定的值
KEY_WOW64_32KEY 32 位注册表
KEY_WOW64_64KEY
64 位的注册表
DWORD Reserved: 保留参数,仅能够赋值 0。
返回值:
同 RegDeleteKey()。
ቤተ መጻሕፍቲ ባይዱ
lpdwDisposition : 出 参 。 当 返 回 REG_CREATED_NEW_KEY 表 示 为 新 建 的 键 , 返 回
REG_OPENED_EXISTING_KEY 表示键已经存在了。
返回值:
成功返回 ERROR_SUCCESS,失败放回非零值。
说明: RegCreateKey()和 RegCreateKeyEx()访问的键不存在时创建键,如果键存在,就打开 该键。
返回值:
成功返回 ERROR_SUCCESS,失败放回非零值。
说明:
用法基本同 RegEnumKey();
三 常用操作键值的函数
1、写键值
LONG RegSetValue( HKEY hKey, LPCTSTR lpSubKey, DWORD dwType, LPCTSTR lpData,
DWORD cbData );
返回时输入写入缓冲区的字符长度,不包括字符串结束标识符。
LPDWORD lpReserved 保留,仅能够赋值 NULL。
LPTSTR lpClass 指向保存子键类型的缓冲区的字符指针。
LPDWORD lpcbClass 用途同 lpcbName
PFILETIME lpftLastWriteTime 出参,FILETIME 结构体指针,保存子键最后修改的时间。
详解常用的注册表操作函数
一 注册表简介 在“运行”对话框中输入 regedit,回车就打开了 windows 的注册表编辑器。如下图:
注册表编辑器对话框左边树显示了注册表的层次,第一层是 5 个以 HKEY 开头的根键, 在 windows 提供的操作注册表的 API 函数中可以直接使用。下面每个节点叫子键,也可以 叫项。用鼠标单击某个键后,右边的列表区域将显示该键的键值。键值包含名称、类型和数 据三个部分。每个键下面有一个默认的键值,类型为 REG_SZ(以 NULL 结尾的字符串), 在 windows 提供的 API 函数中,访问这个默认值在对应参数中输入 NULL 就可以了。下面 会具体提到。 二 常用操作键的函数 1、创建键
PHKEY phkResult 指向 HKEY 类型变量的指针。本参数用于返回创建的键的句 柄。 返回值:
成功返回 ERROR_SUCCESS,失败放回非零值。
LONG RegCreateKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD Reserved,
LPTSTR lpClass,
REGSAM
3、关闭键
LONG RegCloseKey( HKEY hKey );
参数说明
HKEY hKey
已经打开的键的句柄。
返回值:
成功返回 ERROR_SUCCESS,失败放回非零值。
说明:
本函数用于关闭打开的键。
当键不使用后要用这个函数关闭。
4、删除键 LONG RegDeleteKey( HKEY hKey, LPCTSTR lpSubKey ); 参数说明: 两个参数的作用同 RegOpenKey()的同名参数。 注意:hKey 只能是根键名,如果传人的是已经打开的键将删除失败。
参数说明:
HKEY hKey
根键名或已经打开的键的句柄
LPCTSTR lpSubKey 子键名,如果 hKey 已经是该子键的句柄,本参数可以赋值 NULL
DWORD dwType
键值的类型,本参数仅能够赋值 REG_SZ,其他键值类型见最后的
键值类型表。
LPCTSTR lpData
键值的数据
DWORD cbData
LONG RegOpenKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult );
参数说明: 在 RegOpenKey()和基础上 RegOpenKeyEx 增加了两个参数 DWORD ulOptions, samDesired。其他参数同 RegOpenKey() DWORD ulOptions 备用参数,只用赋值 0。 REGSAM samDesired 同 RegCreateKeyEx()的 samDesired 参数。 返回值: 成功返回 ERROR_SUCCESS,失败放回非零值。
Reserved:只能赋值 0
lpClass:键的类型,可以用 NULL 赋值。
dwOptions:这个参数可以取如下的值
REG_OPTION_NON_VOLATILE 键的信息在系统重启后保存到文件中。
REG_OPTION_VOLATILE
键的信息保存在内存中,当系统关闭后,这些信息不被保存。
samDesired:权限设置。可以去如下值
LONG RegDeleteTree(HKEY hKey,LPCTSTR lpSubKey); 参数和返回值同 RegDeleteKey()。 和 RegDeleteKey()的区别是本函数能够删除有子键的键。
5、枚举子键
LONG RegEnumKey( HKEY hKey, DWORD dwIndex, LPTSTR lpName, DWORD cbName )
{
MessageBox(cSubKey);
//用对话框显示子键名
memset(cSubKey,0,sizeof(cSubKey)); //初始化数组
dwIndex++; //索引加 1
}
RegEnumKeyEx LONG RegEnumKeyEx(
HKEY hKey, DWORD dwIndex, LPTSTR lpName, LPDWORD lpcbName, LPDWORD lpReserved, LPTSTR lpClass, LPDWORD lpcbClass,
允许查询值项
KEY_READ
允许枚举子项、修改通知和查询值项
KEY_SET_VALUE
允许设置注册表项的值项
KEY_WRITE
允许创建子项和设置值项
lpSecurityAttributes:设置创建的键的句柄是否可以用于子进程中,赋值为 NULL 表示不能
用于子进程中。
phkResult:出参,保存创建键的句柄。
CONST BYTE *lpData 指向键值的数据。注意本参数是 CONST BYTE *类型,赋值时要
做强制转换。
DWORD cbData
数 据 长 度 。 注 意 写 入 的 是 REG_SZ, REG_EXPAND_SZ, or
打开键有两个函数 RegCreateKey()和 RegCreateKeyEx()。“Ex”表示扩展的意思,比 前一个功能更全面些。
LONG RegCreateKey( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult); 参数说明:
HKEY hKey 键 的 句 柄 , 在 这 个 函 数 中 就 是 指 根 键 的 句 柄 , 就 是 HKEY_CLASSES_ROOT、HKEY_CURRENT_USER 等 5 个根键的名称。
详解常用的注册表操作函数
返回时输入写入缓冲区的字符长度,不包括字符串结束标识符。
LPDWORD lpReserved 保留,仅能够赋值 NULL。
LPTSTR lpClass 指向保存子键类型的缓冲区的字符指针。
LPDWORD lpcbClass 用途同 lpcbName
PFILETIME lpftLastWriteTime 出参,FILETIME 结构体指针,保存子键最后修改的时间。
2、打开键 打开将的函数有 RegOpenKey()和 RegOpenKeyEx()。
LONG RegOpenKey( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult) 参数说明: HKEY hKey;可以用根键名,也可以用已经打开的键的句柄。 LPCTSTR lpSubKey:同 RegCreateKey()lpSubKey。 PHKEY phkResult:出参,HKEY 类型变量的指针,保存打开键的句柄。 返回值: 成功返回 ERROR_SUCCESS,失败放回非零值。 说明: 如果 HKEY_CLASSES_ROOT\pro 这个键已经打开,并且将句柄保存在 hRe 中。那么要打开 HKEY_CLASSES_ROOT\pro\subpro1 就可以用 RegOpenKey(hRe,“subpro1”,&hRe1);来 打开 subpro1 子键。
hKey 用根键名,lpSubKey 指定要删除的键。这样无论该键是否打开都可以删除。 返回值: 成功返回 ERROR_SUCCESS,失败放回非零值。 说明: 本函数仅能够删除没有子键的键。删除时键中的所有键值将一并删除。
LONG RegDeleteKeyEx( HKEY hKey, LPCTSTR lpSubKey, REGSAM samDesired, DWORD
modify_reg函数的用法 -回复
modify_reg函数的用法-回复Modify_reg函数是一个用于修改注册表的函数,在Windows操作系统中,注册表是一个分层的数据库,用于存储操作系统、应用程序和硬件设备的配置信息。
修改注册表可以实现各种功能,例如更改系统设置、优化性能和安全性等。
在使用Modify_reg函数之前,我们需要先了解一些注册表的基础知识。
注册表由多个键(Key)和值(Value)组成,每个键又可以包含子键和值。
键的路径类似于文件系统的目录结构,可以通过路径来访问特定的键。
值则存储着具体的配置信息。
首先,我们需要引入Modify_reg函数所在的库文件。
通常,这个库文件是一个动态链接库(DLL)文件,以“.dll”为文件后缀名。
我们可以使用“#include”预处理指令来包含库文件。
例如,如果Modify_reg函数所在的库文件是“reglib.dll”,则我们可以使用以下代码引入库文件:#include "reglib.dll"接下来,我们需要声明Modify_reg函数及其参数的类型。
通常,Modify_reg函数的参数包括键的路径、要修改的键的名称、新的值等。
在C/C++语言中,我们可以使用“void”关键字来声明函数的返回类型为无返回值,然后按照函数参数的类型顺序依次声明参数。
例如,如果Modify_reg函数的声明如下所示:void Modify_reg(char* keyPath, char* keyName, int newValue);然后,我们需要通过调用Modify_reg函数来实际修改注册表。
在参数列表中,我们需要传入具体的键的路径、键的名称和新的值。
例如,如果我们要修改注册表中的一个名为“ExampleKey”的键的值为100,我们可以使用以下代码调用Modify_reg函数:Modify_reg("HKEY_CURRENT_USER\Software\Example", "ExampleKey", 100);在调用Modify_reg函数之后,函数会尝试找到指定路径中的键,并修改该键的名称为新的值。
mfc读写注册表函数
mfc读写注册表函数在Microsoft Foundation Classes (MFC)库中,读写注册表的函数通常通过CWinThread类和CWinApp类的成员函数实现。
以下是一些常用的函数:SetRegistryKey:这个函数用于设置当前线程的注册表键。
cppvoid SetRegistryKey(LPCTSTR lpszRegistryKey); OpenRegistryKey:这个函数用于打开一个指定的注册表键。
cppBOOL OpenRegistryKey(HKEY hRootKey, LPCTSTR lpszSubKey, HKEY& hKey);WriteRegistryValue:这个函数用于写入一个注册表值。
cppBOOL WriteRegistryValue(LPCTSTR lpszValueName, DWORD dwType, LPVOID lpData, DWORD cbData);ReadRegistryValue:这个函数用于读取一个注册表值。
cppBOOL ReadRegistryValue(LPCTSTR lpszValueName, DWORD& dwType, LPVOID lpData, DWORD& cbData);使用MFC读写注册表的例子:写入注册表cppCWinThread* pThread = AfxGetThread();pThread->SetRegistryKey(_T("Software\\MyApp"));HKEY hKey;if (pThread->OpenRegistryKey(_T(""), KEY_WRITE, hKey) == ERROR_SUCCESS) {CString valueName = _T("KeyName");DWORD dwValue = 12345;if (pThread->WriteRegistryValue(valueName, REG_DWORD, &dwValue, sizeof(dwValue)) == ERROR_SUCCESS) {AfxMessageBox(_T("写入注册表成功!"));} else {AfxMessageBox(_T("写入注册表失败!"));}pThread->RegCloseKey(hKey);} else {AfxMessageBox(_T("打开注册表键失败!"));}读取注册表cppCWinThread* pThread = AfxGetThread();pThread->SetRegistryKey(_T("Software\\MyApp"));HKEY hKey;if (pThread->OpenRegistryKey(_T(""), KEY_READ, hKey) == ERROR_SUCCESS) {CString valueName = _T("KeyName");DWORD dwType, dwValue;DWORD cbData = sizeof(dwValue);if (pThread->ReadRegistryValue(valueName, &dwType, &dwValue, &cbData) == ERROR_SUCCESS) {AfxMessageBox(_T("读取到的值是:") + dwValue); } else {AfxMessageBox(_T("读取注册表值失败!"));}pThread->RegCloseKey(hKey);} else {AfxMessageBox(_T("打开注册表键失败!"));}。
regopenkey函数
regopenkey函数regopenkey函数是在Windows操作系统中广泛使用的一个功能,用于打开注册表中指定键值的函数。
本文将一步一步回答关于regopenkey函数的相关问题,深入探讨其使用方法和实际应用。
一、什么是regopenkey函数?regopenkey函数是Windows操作系统提供的一个API函数,用于打开注册表中的指定键值。
注册表是Windows系统中通过键值对的形式存储配置信息的重要数据存储区域,其中包含了操作系统和应用程序的配置信息。
regopenkey函数可以根据指定的路径和键名打开相应的注册表键值,以便进行读取或写入操作。
二、regopenkey函数的语法和参数regopenkey函数的语法如下:c++LONG RegOpenKey(HKEY hKey,LPCTSTR lpSubKey,PHKEY phkResult);其中,参数hKey表示要打开键的父键,lpSubKey表示要打开键的名称,phkResult表示函数执行成功后返回的键句柄。
三、如何使用regopenkey函数?1. 引入Windows.h头文件:在使用regopenkey函数之前,需要引入Windows.h头文件,该头文件定义了Windows操作系统的API函数和数据类型。
2. 打开注册表父键:使用regopenkey函数之前,需要先打开注册表的父键。
可以使用RegOpenKeyEx函数或者RegCreateKeyEx函数来打开或创建父键。
3. 调用regopenkey函数:使用regopenkey函数来打开指定的注册表键值。
在调用该函数时,需要传入父键句柄、子键名称和存储返回键句柄的变量。
4. 检查返回值:在调用regopenkey函数后,需要检查返回值以判断函数是否执行成功。
如果返回值为ERROR_SUCCESS,表示函数执行成功,否则表示执行失败。
5. 使用返回的键句柄:当regopenkey函数成功执行后,返回的键句柄可用于进行读取或写入注册表信息的操作。
C_注册表操作理论及应用
4.枚举第一个键
//using System.Collections;
IEnumerator<string> it = SubKey.GetSubKeyNames().First();
string %%1=it.Current;
subkeyNames = aimdir.GetSubKeyNames();
foreach(string keyName in subkeyNames)
{
if(keyName == name)
{
_exit = true;
//using Microsoft.Win32;
private static void Access_Registry(RegistryKey keyR, String str)
{
string[] subkeyNames;
string[] subvalueNames;
const string strSubKey = %%1; //@"SOFTWARE\ODBC\ODBC.INI\DBNewTest\Test"
RegistryKey rkSub = rkLocalM.CreateSubKey( strSubKey );
rkLocalM.Close();
3.删除键
return _exit;
}
}
return _exit;
}
以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;
VBA操作注册表的三种方法
教大家用VBA来控制注册表三种办法1、利用强大的API函数。
API功能强大,除了其它功能外也可以用来操作注册表,但一般都会封装原始的API函数,使操作注册表更方法2、利用Windows Scripting Host的注册表函数来完成。
WSH的RegWrite(设置注册表的键或值),RegRead (获得注册表的键或值与RegDelete(删除键或值)也可以用来操作注册表,而且没有上面的限制,下面还是用一段代码来了解这三个函数的用法:Sub 利用WSH操作注册表()Dim 注册表主键As StringDim 工程名称As StringDim 注册表项As StringDim 注册表键名As V ariantDim 注册表键值As V ariantDim arr As V ariantDim ii As IntegerDim WSH As WshShellSet WSH = CreateObject("WSCRIPT.SHELL")注册表主键= "HKEY_CURRENT_USER\Software\"工程名称= "Excel吧"注册表项= "网站"注册表键名= Array("地址", "站长", "创建时间")注册表键值For ii = 0 To UBound(注册表键名)WSH.RegWrite 注册表主键& 工程名称& "\" & 注册表项& "\" & 注册表键名(ii), 注册表键值(ii) NextMsgBox "已成功在" & 注册表主键& "中写入键值!"MsgBox "接下来利用RegRead一个个读出写入的键值"For ii = 0 To UBound(注册表键名)MsgBox 工程名称& 注册表项& 注册表键名(ii) & "是" & WSH.RegRead(注册表主键& 工程名称& "\" & 注册表项& "\" & 注册表键名(ii))NextWSH.RegDelete 注册表主键& 工程名称& "\" & 注册表项& "\"WSH.RegDelete 注册表主键& 工程名称& "\"MsgBox "已成功删除写入的键值!"End Sub3、利用内置的操作注册表的函数来完成。
mfc读写注册表函数
mfc读写注册表函数摘要:1.MFC 简介2.注册表简介3.MFC 中的注册表操作函数4.读写注册表的实例代码正文:一、MFC 简介MFC(Microsoft Foundation Class)是微软提供的一套用于开发Windows 应用程序的类库。
它提供了许多方便的类和函数,使开发者能够简化编程过程,快速地开发出功能强大的应用程序。
二、注册表简介注册表是Windows 操作系统中的一个核心组件,用于存储系统和应用程序的配置信息。
它由一系列键值对组成,可以存储各种数据类型,如字符串、整数、布尔值等。
注册表具有较高的安全性和稳定性,可以确保应用程序和系统配置的正确性。
三、MFC 中的注册表操作函数MFC 提供了一系列用于操作注册表的函数,包括读取、写入和删除注册表键值等。
以下是一些常用的MFC 注册表操作函数:1.RegOpenKeyEx:打开注册表键2.RegCloseKey:关闭注册表键3.RegSetValueEx:写入注册表键值4.RegGetValueEx:读取注册表键值5.RegDeleteValue:删除注册表键值6.RegEnumValue:枚举注册表键的值7.RegCreateKey:创建注册表键四、读写注册表的实例代码下面是一个使用MFC 读写注册表的简单示例:```cpp#include <afx.h>#include <iostream>void ReadRegistration(void){// 打开注册表键HKEY hKey;if (RegOpenKeyEx(HKEY_CURRENT_USER, "SoftwareMyApp", 0, KEY_READ, &hKey)!= ERROR_SUCCESS){MessageBox("打开注册表键失败!");return;}// 读取注册表键值DWORD dwValue;if (RegGetValueEx(hKey, "key_name", 0, &dwValue,sizeof(dwValue))!= ERROR_SUCCESS){MessageBox("读取注册表键值失败!");RegCloseKey(hKey);return;}// 输出读取到的值std::cout << "读取到的值:" << dwValue << std::endl;// 关闭注册表键RegCloseKey(hKey);}void WriteRegistration(void){// 打开注册表键HKEY hKey;if (RegOpenKeyEx(HKEY_CURRENT_USER, "SoftwareMyApp", 0, KEY_WRITE, &hKey)!= ERROR_SUCCESS){MessageBox("打开注册表键失败!");return;}// 写入注册表键值DWORD dwValue = 12345;if (RegSetValueEx(hKey, "key_name", 0, &dwValue, sizeof(dwValue))!= ERROR_SUCCESS){MessageBox("写入注册表键值失败!");RegCloseKey(hKey);return;}// 输出写入到的值std::cout << "写入到的值:" << dwValue << std::endl;// 关闭注册表键RegCloseKey(hKey);}int main(){// 读取注册表值ReadRegistration();// 写入注册表值WriteRegistration();return 0;}```以上代码示例首先打开注册表键,然后分别读取和写入键值。
注册表API函数
作者:loose_went 阅读人次:341 文章来源:VC在线 发布时间:2007-8-22 网友评论(0)条
注册表的操作,API为我们提供了大约25个函数。他提供了对注册表的读取,写入,删除,以及打开注册表及键值时所有函数,并且可以达到对注册表的备份,连接和对远端注册表进行查看等等。注册表对整个系统十分重要,你在进行操作时,一定要先考虑清楚。这些函数有:
LPDWORD lpType, // 查询的类型
LPBYTE lpData, // 数据存放的地址
LPDWORD lpcbData // 数据长度+1
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}
if(dwDisposition==REG_OPENED_EXISTING_KEY)
LPDWORD lpdwDisposition //用来查看是打开一个已经有的键,还是新建了键
);
RegCreateKey()函数简单了不少,请自己看了。
返回值:不成功返回非0,成功返回ERROR_SUCCESS.
解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。当在创建或打开注册表的键时,需要指定访问权限,而这些访问权限需要到一级。默认的权限是KEY_ALL_ACCESS权限。还有KEY_CREATE_LINK创建字符链权限,KEY_CREATE_SUB_KEY创建子键权限,KEY_EXECUTE读取键权限,KEY_NOTIFY获得修改键通知的权限,KEY_QUERY_VALUE查询键值的权限,KEY_SET_VALUE设置数据值的权限。注意不能在根一级建键,在注册表的根一级仅可有预定义的键。具体使用,请查看联机手册。
C 注册表操作大全
C++注册表操作大全.txt用快乐去奔跑,用心去倾听,用思维去发展,用努力去奋斗,用目标去衡量,用爱去生活。
钱多钱少,常有就好!人老人少,健康就好!家贫家富,和睦就好。
1.打开键CString StrKey(%%1);HKEY m_hKey=%%2;if (ERROR_SUCCESS==::RegOpenKeyEx(m_hKey,StrKey,NULL,KEY_ALL_ACCESS,&m_hKey)) {%%3}2.添加键CString StrKey(%%1);HKEY hKey;DWORD dwDisposition;if (ERROR_SUCCESS==::RegCreateKeyEx(m_hKey, (LPCTSTR)StrKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition)){m_hKey=hKey;if (dwDisposition==REG_CREATED_NEW_KEY){%%2}else if (dwDisposition==REG_OPENED_EXISTING_KEY){%%3}}3.删除键CString StrKey(%%1);HKEY SrcKey=m_hKey;char KeyName[256];int nRes=0;if (OpenKey(SrcKey,StrKey)){nRes=FirstEnumKey(KeyName);while (nRes){DeleteKey(KeyName);nRes=NextEnumKey(KeyName);}}if (::RegDeleteKey(SrcKey,StrKey)==ERROR_SUCCESS){%%2}4.枚举第一个键DWORD dwSize=255;m_EnumLoop=0;if(ERROR_SUCCESS==::RegEnumKeyEx(m_hKey,m_EnumLoop,%%1,&dwSize,NULL,NULL,NULL,NULL )){%%2}5.枚举下一个键DWORD dwSize=255;m_EnumLoop++;if(ERROR_SUCCESS==::RegEnumKeyEx(m_hKey,m_EnumLoop,%%1,&dwSize,NULL,NULL,NULL,NULL )){%%2}6.获取DWORD值CString StrChildKey(%%1);DWORD %%1;DWORD dwSize=255,dwType=REG_DWORD;if (ERROR_SUCCESS==::RegQueryValueEx(m_hKey,StrChildKey,0,&dwType,(BYTE *)(&%%2),&dwSize)){%%2}7.获取二进制值CString StrChildKey(%%1);DWORD %%1;DWORD dwSize=255,dwType=REG_BINARY;if (ERROR_SUCCESS==::RegQueryValueEx(m_hKey,StrChildKey,0,&dwType,(BYTE *)(&%%2),&dwSize)){%%2}8.读取字符串值CString StrChildKey(%%1);CString %%2;DWORD dwSize=255,dwType=REG_SZ;char String[256];if (ERROR_SUCCESS==::RegQueryValueEx(m_hKey,StrChildKey,0,&dwType,(BYTE *)String,&dwSize))%%2=CString(String);9.写入字符串值CString StrChildKey(%%1);CString Value;CString %%2;if (ERROR_SUCCESS==::RegSetValueEx( m_hKey,(LPCTSTR)StrChildKey,0,REG_SZ,(BYTE *)(LPCSTR)Value,strlen(Value)+1) )%%2=CString(Value);10.写入二进制值CString StrChildKey(%%1);const char* %%2;if(ERROR_SUCCESS==::RegSetValueEx( m_hKey,(LPCTSTR)StrChildKey,0,REG_BINARY,(BYTE *)%%2,strlen(Value)) ){%%3}11.写入DWORD值CString StrChildKey(%%1);DWORD %%2;if (ERROR_SUCCESS==::RegSetValueEx( m_hKey,(LPCTSTR)StrChildKey,0,REG_DWORD,(BYTE *)&%%2,sizeof(Value)) ){%%3}12.设置DWORD值BOOL CRegEdit::SetDwordValue(HKEY Root, LPCTSTR StrKey, LPCTSTR StrChildKey, DWORD Value)m_hKey=m_RootKey=Root;if (CreateKey(StrKey)){if (WriteDword(StrChildKey,Value)){%%2}13.删除值if (ERROR_SUCCESS==RegDeleteValue(m_hKey,%%1)){%%2}14.关闭键if (m_hKey!=NULL)::RegCloseKey(m_hKey);15.列出一个键下所有的子键//#define MAX_KEY_LENGTH 255TCHAR subKey[MAX_KEY_LENGTH];DWORD numSubKey=0;DWORD i;DWORD sizeSubKey;TCHAR subKey[MAX_KEY_LENGTH];RegQueryInfoKey(m_hKey,NULL,NULL,NULL,&numSubKey,NULL,NULL,NULL,NULL,NULL,NULL,N ULL);if (numSubKey){for (i=0; i<numSubKey; i++){subKey[0]='\0';sizeSubKey=MAX_KEY_LENGTH;RegEnumKeyEx(m_hKey,i,subKey,&sizeSubKey,NULL,NULL,NULL,NULL);CString %%1=CString(subKey);}}16.列出一个键下所有的值//#define MAX_KEY_LENGTH 255//#define MAX_VALUE_NAME 16383TCHAR achKey[MAX_KEY_LENGTH];DWORD cbName;TCHAR achClass[MAX_PATH] = TEXT("");DWORD cchClassName = MAX_PATH;DWORD cSubKeys=0;DWORD cbMaxSubKey;DWORD cchMaxClass;DWORD cValues;DWORD cchMaxValue;DWORD cbMaxValueData;DWORD cbSecurityDescriptor;FILETIME ftLastWriteTime;DWORD i, retCode;TCHAR achValue[MAX_VALUE_NAME];DWORD cchValue = MAX_VALUE_NAME;retCode = RegQueryInfoKey;(m_hKey,achClass,&cchClassName,NULL,&cSubKeys,&cbMaxSubKey,&cchMaxClass,&cValues ,&cchMaxValue,&cbMaxValueData,&cbSecurityDescriptor,&ftLastWriteTime);if (cValues){for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++){cchValue = MAX_VALUE_NAME;achValue[0] = '\0';retCode = RegEnumValue(m_hKey, i,achValue,&cchValue,NULL,NULL,NULL,NULL);if (retCode == ERROR_SUCCESS ){CString %%1=CString(achValue);%%2}}}17.列出一个键下所有的子键和值//#define MAX_KEY_LENGTH 255//#define MAX_VALUE_NAME 16383TCHAR achKey[MAX_KEY_LENGTH];DWORD cbName;TCHAR achClass[MAX_PATH] = TEXT("");DWORD cchClassName = MAX_PATH;DWORD cSubKeys=0;DWORD cbMaxSubKey;DWORD cchMaxClass;DWORD cValues;DWORD cchMaxValue;DWORD cbMaxValueData;DWORD cbSecurityDescriptor;FILETIME ftLastWriteTime;DWORD i, retCode;TCHAR achValue[MAX_VALUE_NAME];DWORD cchValue = MAX_VALUE_NAME;retCode = RegQueryInfoKey(m_hKey,achClass,&cchClassName,NULL,&cSubKeys,&cbMaxSubKey,&cchMaxClass,&cValues ,&cchMaxValue,&cbMaxValueData,&cbSecurityDescriptor,&ftLastWriteTime);if (cSubKeys){for (i=0; i<cSubKeys; i++){cbName = MAX_KEY_LENGTH;retCode = RegEnumKeyEx(m_hKey,i,achKey,&cbName,NULL,NULL,NULL,&ftLastWriteTime); if (retCode == ERROR_SUCCESS) {CString %%1=CString(achKey);%%2}}}if (cValues){for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++){cchValue = MAX_VALUE_NAME;achValue[0] = '\0';retCode = RegEnumValue(m_hKey, i,achValue,&cchValue,NULL,NULL,NULL,NULL);if (retCode == ERROR_SUCCESS ){CString %%3=CString(achValue);%%4}}}18.枚举所有的子键和值void RegSearch(HKEY hKey, TCHAR rootKey[], CString path){DWORD numSubKey=0; //存放子键的项数DWORD i; //计数DWORD sizeSubKey; //子键大小TCHAR subKey[MAX_KEY_LENGTH]; //子键名/*打开hKey中的rootKey, hKey乃继承递归调用者之hKey, rootKey乃递归调用者之subKey*/RegOpenKeyEx( hKey, //欲开之键柄rootKey, //欲开之根键名0, //保留值,强制0KEY_READ, //权限&hKey); //打开子键后,返回键柄/*首先查当前键下的值们(表明是复数哈)是否有符合条件的*/if (RegQueryValueEx( hKey, //欲开之键柄m_content, //欲查询的值NULL,NULL,NULL,NULL)==ERROR_SUCCESS){findFlag=1; //在该键下,直接查找成功m_result=path;return; //跳出递归}/*没有查到,则进入子键查询*/else{/*首先查得当前键下的子键项数*/RegQueryInfoKey( hKey,NULL,NULL,NULL,&numSubKey, //查得子键的项数NULL,NULL,NULL,NULL,NULL,NULL,NULL);/*如果子键数不为0,遍历子键*/if (numSubKey){for (i=0; i<numSubKey; i++){subKey[0]='\0'; //该两行很重要,保证了每次循环的初始sizeSubKey=MAX_KEY_LENGTH; //第一行清空子键,第二行赋缓冲区大小RegEnumKeyEx( hKey, //键柄i, //子键序号subKey, //存入子键名&sizeSubKey,//指明缓冲区大小NULL,NULL,NULL,NULL);RegSearch (hKey,subKey,path+subKey+"\\"); //递归}}}RegCloseKey(hKey); //收尾工作是一定要做的,否则机器会异常的慢}RegSearch (HKEY_USERS,"","");m_result="HKEY_USERS\\"+m_result;break;RegSearch(HKEY_LOCAL_MACHINE,"","");m_result="HKEY_LOCAL_MACHINE\\"+m_result;break;19.模糊搜索所有的子键和值,查找特定字符串并删除void RegSearch(HKEY hKey, TCHAR rootKey[], CString path){DWORD numSubKey=0; //存放子键的项数DWORD i; //计数DWORD sizeSubKey; //子键大小TCHAR subKey[MAX_KEY_LENGTH]; //子键名/*打开hKey中的rootKey, hKey乃继承递归调用者之hKey, rootKey乃递归调用者之subKey*/RegOpenKeyEx( hKey, //欲开之键柄rootKey, //欲开之根键名0, //保留值,强制0KEY_READ, //权限&hKey); //打开子键后,返回键柄/*首先查当前键下的值们(表明是复数哈)是否有符合条件的*/if (RegQueryValueEx( hKey, //欲开之键柄m_content, //欲查询的值NULL,NULL,NULL,NULL)==ERROR_SUCCESS){findFlag=1; //在该键下,直接查找成功m_result=path;return; //跳出递归}/*没有查到,则进入子键查询*/else{/*首先查得当前键下的子键项数*/RegQueryInfoKey( hKey,NULL,NULL,NULL,&numSubKey, //查得子键的项数NULL,NULL,NULL,NULL,NULL,NULL,NULL);/*如果子键数不为0,遍历子键*/if (numSubKey){for (i=0; i<numSubKey; i++){subKey[0]='\0'; //该两行很重要,保证了每次循环的初始sizeSubKey=MAX_KEY_LENGTH; //第一行清空子键,第二行赋缓冲区大小RegEnumKeyEx( hKey, //键柄i, //子键序号subKey, //存入子键名&sizeSubKey,//指明缓冲区大小NULL,NULL,NULL,NULL);RegSearch (hKey,subKey,path+subKey+"\\"); //递归}}}RegCloseKey(hKey); //收尾工作是一定要做的,否则机器会异常的慢}RegSearch (HKEY_USERS,"","");m_result="HKEY_USERS\\"+m_result;break;RegSearch(HKEY_LOCAL_MACHINE,"","");m_result="HKEY_LOCAL_MACHINE\\"+m_result;break;。
C#操作注册表
C#操作注册表⼀.注册表巢在注册表中,最上⾯的节点是注册表巢(registry hive)。
HKEY_CLASSES_ROOT(HKCR) 包含系统⽂件类型的细节,以及应⽤程序可以打开的⽂件类型,它还包含所有COM组件的注册信息。
HKEY_CURRENT_USER(HKCU) 包含⽤户⽬前登陆的机器的⽤户配置,包括桌⾯设置、环境变量、⽹络和打印机连接和其他定义⽤户操作环境的变量。
HKEY_LOCAL_MACHINE(HKLM) 是⼀个很⼤的巢,其中包含所有安装到机器上的软件和硬件的信息。
HKEY_USERS(HKUSR) 包含所有⽤户的⽤户配置。
HKEY_CURRENT_CONFIG(HKCF) 包含机器上硬件的信息。
⼆.注册表类及常⽤属性和函数using Microsoft.Win32;这个命名空间包含了注册表相关的类。
Registry类、RegistryKey类。
Registry类封装了注册表的七个基本主键:Registry.ClassesRoot对应于HKEY_CLASSES_ROOT主键Registry.CurrentUser对应于HKEY_CURRENT_USER主键Registry.LocalMachine对应于 HKEY_LOCAL_MACHINE主键er对应于 HKEY_USER主键Registry.CurrentConfig对应于HEKY_CURRENT_CONFIG主键Registry.DynDa 对应于HKEY_DYN_DATA主键Registry.PerformanceData对应于HKEY_PERFORMANCE_DATA主键RegistryKey类封装了对注册表的基本操作。
包括读、写、删等操作的常⽤函数:Name键的名称(只读)SubKeyCount键的⼦键个数ValueCount键包含的值的个数Close()关闭键CreateSubKey()创建给定名称的⼦键DeleteSubKey()删除指定的⼦键DeleteSubKeyTree()递归删除⼦键及其所有的⼦键DeleteValue()从键中删除⼀个指定的值GetAccessControl()返回指定注册表键的访问控制表GetSubKeyNames()返回包含⼦键名称的字符串数组GetValue()返回指定的值GetValueKind()返回指定的值,检索其注册表数据类型GetValueNames()返回⼀个包含所有键值名称的字符串数组OpenSubKey()返回表⽰给定⼦键的RegistryKey实例引⽤SetAccessControl()把访问控制表(ACL)应⽤于指定的注册表键SetValue()设置指定的值三注册表项的创建、打开、删除1,创建//使⽤CreateSubKey()在SOFTWARE下创建⼦项testRegistryKey hklm = Registry.LocalMachine;RegistryKey hkSoftWare = hklm.CreateSubKey(@"SOFTWARE\test");hklm.Close();hkSoftWare.Close();2,打开//使⽤OpenSubKey()打开项,获得RegistryKey对象,当路径不存在时,为Null。
