为何用程序写入注册表后,重启机器注册表项就彻底丢失呢
仔细看看RegCreateKeyEx的用法
其中的dwOptions使用:REG_OPTION_NON_VOLATILE
而不是:REG_OPTION_VOLATILE
重启电脑创建的注册表键值丢失原因
REG_OPTION_VOLATILE 这个参数的意思是创建的注册表键值都位于内存中,不会保存到相应的注册表文件中。
英文如下:
All registry keys are created as volatile, and the information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the OS is shut down. TheRegSaveKey function does not save volatile registry keys. This flag is ignored for keys that already exist.
所以,重启后这些键值当然就没有了。
解决办法
很简单,使用REG_OPTION_NON_VOLATILE 即可
RegCreateKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, NULL, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS , NULL , &hKey, NULL);
REG_OPTION_VOLATILE可以用在测试上。一重启,之前创建的键值都没了。
而若想重启之后注册表键值也仍然保留的话就用REG_OPTION_NON_VOLATILE。
REG_OPTION_NON_VOLATILE:
该宏是RegCreateKeyEx函数的参数可选项。
LONG RegCreateKeyEx( HKEY hKey,
LPCWSTR lpSubKey,
DWORD Reserved,
LPWSTR lpClass,
DWORD dwOptions,
REGSAM samDesired,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition );
看看MSDN对它的说明:
Default setting. All registry keys are created as non-volatile and the information stored in memory is preserved when the OS is restarted. The RegSaveKey function saves keys that are non-volatile.
翻译:默认设置。 所有注册表项 创建 作为非易失性 和 操作系统 重新启动 时保留 在内存 中存储的信息 。 RegSaveKey 功能 键 是 非易失性 保存 。
意思是说如果参数 dwOptions 选择REG_OPTION_NON_VOLATILE,则通过RegCreateKeyEx创建的注册表是永久的,不会因为计算机的重启而消失。相反参数选择REG_OPTION_VOLATILE,则表明创建的注册表是临时的,计算机重启后该注册表不存在。
dwOptions
[in] Registry key options. The following table shows the possible values for this parameter.
Value | Description |
---|
REG_OPTION_NON_VOLATILE | Default setting. All registry keys are created as non-volatile and the information stored in memory is preserved when the OS is restarted. The RegSaveKey function saves keys that are non-volatile. |
REG_OPTION_VOLATILE | All registry keys are created as volatile, and the information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the OS is shut down. The RegSaveKey function does not save volatile registry keys. This flag is ignored for keys that already exist. |
一.注册表巢
在注册表中,最上面的节点是注册表巢(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主键 |
Registry.User |
对应于 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下创建子项test
RegistryKey hklm = Registry.LocalMachine;
//如果想关机也能保存不释放需使用CreateSubKey的带有设置dwOptions的同名方法并设置为
//REG_OPTION_NON_VOLATILE
RegistryKey hkSoftWare = hklm.CreateSubKey(@"SOFTWARE\test");
hklm.Close();
hkSoftWare.Close();
2,打开
//使用OpenSubKey()打开项,获得RegistryKey对象,当路径不存在时,为Null。第二个参数为true,表示可写,可读,可删;省略时只能读。
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true);
hklm.Close();
hkSoftWare.Close();
3,删除
//主要用到了DeleteSubKey(),删除test项
RegistryKey hklm = Registry.LocalMachine;
hklm.DeleteSubKey(@"SOFTWARE\test", true); //为true时,删除的注册表不存在时抛出异常;当为false时不抛出异常。
hklm.Close();
四、注册表键值的创建、打开和删除
1,创建
//主要用到了SetValue(),表示在test下创建名称为Name,值为RegistryTest的键值。第三个参数表示键值类型,省略时,默认为字符串
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true);
hkSoftWare.SetValue("Name", "RegistryTest", RegistryValueKind.String);
hklm.Close();
hkSoftWare.Close();
2,打开
//主要用到了GetValue(),获得名称为"Name"的键值
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true);
string sValue = hkSoftWare.GetValue("Name").ToString();
hklm.Close();
hkSoftWare.Close();
3,删除
//主要用到了DeleteValue(),表示删除名称为"Name"的键值,第二个参数表示是否抛出异常
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true);
hkSoftWare.DeleteValue("Name", true);
hklm.Close();
hkSoftWare.Close();
五、判断注册表项、注册表键值是否存在
//判断注册表项是否存在
private bool IsRegistryKeyExist(string sKeyName)
{
string[] sKeyNameColl;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE");
sKeyNameColl = hkSoftWare.GetSubKeyNames(); //获取SOFTWARE下所有的子项
foreach (string sName in sKeyNameColl)
{
if (sName == sKeyName)
{
hklm.Close();
hkSoftWare.Close();
return true;
}
}
hklm.Close();
hkSoftWare.Close();
return false;
}
//判断键值是否存在
private bool IsRegistryValueNameExist(string sValueName)
{
string[] sValueNameColl;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkTest = hklm.OpenSubKey(@"SOFTWARE\test");
sValueNameColl = hkTest.GetValueNames(); //获取test下所有键值的名称
foreach (string sName in sValueNameColl)
{
if (sName == sValueName)
{
hklm.Close();
hkTest.Close();
return true;
}
}
hklm.Close();
hkTest.Close();
return false;
}
六、程序自启动程序
//开启程序自启动
string path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.SetValue("JcShutdown", path);
rk2.Close();
rk.Close();
//关闭程序自启动
string path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.DeleteValue("JcShutdown", false);
rk2.Close();
rk.Close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)