目录
一.实验目的...
1.1注册表:...
1.2注册表结构:...
1.3 注册表编程:...
二.实验环境...
2.1 硬件环境...
2.2 软件环境...
2.3开发工具...
三.程序代码...
3.1 打开/关闭注册表句柄:...
3.2获取子键/键值信息:.
3.3创建/删除子键:.
3.4 创建/删除键值项:.
四.实验截图...
4.1 打开/关闭注册表句柄:.
4.2 创建/删除子键:.
4.3 创建/删除键值项:.
五.实验心得...
一.实验目的 1.1注册表:
注册表是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用。
注册表在windows中非常重要,它是一个庞大的数据库,里面保存了大量的系统信息,例如保存软件硬件的配置信息,计算机系统的设置,性能记录。如果注册表遭到破坏,就可能对整个系统造成影响,甚至系统瘫痪。
1.2注册表结构:打开注册表:可能通过控制面板打开,也有很多其他途径能打开,本人常用方法是在【开始】菜单中选择【运行】命令,然后在框中输入命令regedit,如图:
从图中可看出,注册表是层叠式构架的,左边的树形列表,第一级有5个根键,点开第一级接着有第二级,第三级等等,这叫项,也就是说,根键下面的是项,而项下面如果还有子级那叫子项,直到最后一级如图中路径”HKEY_CURRENT_CONFIGSOFTWAREFONTS”,其中Fonts是Software的子项,Fonts是最后一级,它没有子项了,再Fonts下面就是值项了,在右边一栏,值项由名称,类型,数据组成,值项就是最终保存具体数据的地方。
1.3 注册表编程:借助底层API用程序完成原本手工要做的事情,;例如查、删、增、改等操作。
二.实验环境
2.1 硬件环境
2.2 软件环境
Windows 10 64位;
2.3开发工具
Visual Studio 2022;
三.程序代码
3.1 打开/关闭注册表句柄:
RegOpenKeyEx(
hKey, //父键句柄
lpSubKey, //子键句柄
dwOptions, //系统保留,指定为0
samDesired, //打开权限
phkResult, //返回打开句柄
);
#include
#include
#include
#include
#include
using namespace std;
#include
int main()
{
HKEY key;
LPCTSTR data = L"Software\Microsoft\Windows\CurrentVersion\run";
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data, 0, KEY_CREATE_SUB_KEY, &key))
{
printf("get regedit!n");
}
else {
printf("fail to get regedit!n");
}
::RegCloseKey(key);
}
3.2获取子键/键值信息:RegQueryInfoKey(
hkey, //要获取信息的句柄
lpClass, //接受创建健时的Class字符串
lpcbClass, //lpClass的长度
lpReserved, //系统保留,指定为0
lpcSubKeys, //子键数量
lpcbMaxSubKeyLen, //子键中最长名称的长度
lpcbMaxClassLen, //子键中最长Class字符串长度
lpcVlaues, //键值数量
lpcbMaxValueNameLen, //键值项中最长名称的长度
lpcbMaxValueLen, //键值项数据最大长度
lpcbSecurityDescriptor, //安全描述符长度
lpftLastWriteTime, //FILETIME结构,最后修改时间
);
#include
#include
#include
#include
#include
using namespace std;
#include
#include
int main()
{
int szValueDate1=21;
HKEY key;
LPCTSTR data = L"Software\Microsoft\Windows\CurrentVersion\run";
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data, 0, KEY_ALL_ACCESS, &key))
{
DWORD dwIndex = 0, NameSize, NameCnt, NameMaxLen, Type;
DWORD KeySize, KeyCnt, KeyMaxLen, MaxDateLen;
DWORD DateSize;
if (ERROR_SUCCESS != RegQueryInfoKey(key, NULL, NULL, NULL, &KeyCnt, &KeyMaxLen, NULL, &NameCnt, &NameMaxLen, &MaxDateLen, NULL, NULL))
{
printf("RegQueryInfoKey错误");
}
}
else {
printf("fail to get regedit!n");
}
::RegCloseKey(key);
}
RegCreateKeyEx(
hkey, //父键句柄
lpSubKey, //子键句柄
Reserved, //系统保留,指定为0
lpClass, //定义子键类名,通常设为NULL
dwOptions, //创建子键时的选项
samDesired, //创建后操作权限
lpSecurityAttributes, //指向SECURITY_ATTRIBUTES结构,指定键句柄的继承性
phkResult, //返回创建句柄
lpdwDisposition //通常设为NULL
);
#include
#include
#include
#include
#include
using namespace std;
#include
int main()
{
HKEY key;
LPCTSTR data = L"Software\Microsoft\Windows\CurrentVersion\run";
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data, 0, KEY_ALL_ACCESS, &key))
{
if (ERROR_SUCCESS != RegCreateKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\run\MyKey", &key))
{
printf("创建失败!n");
}
else
{
printf("创建成功!n");
}
if (ERROR_SUCCESS == RegDeleteKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\run\MyKey"))
{
printf("删除子键成功!n");
}
else
{
printf("删除子键失败!n");
return 0;
}
}
else {
printf("fail to get regedit!n");
}
::RegCloseKey(key);
} 3.4 创建/删除键值项:
RegSetValueEx(
hkey, //键句柄,键值项将保存在此键下
lpValueName, //键值项名称
Reserved, //系统保留,指定为0
dwType, //键值项类型
lpDate, //键值项数据
cbDate //键值项长度
);
#include
#include
#include
#include
#include
using namespace std;
#include
#include
int main()
{
int szValueDate1 =231;
HKEY key;
LPCTSTR data = L"Software\Microsoft\Windows\CurrentVersion\run\Subkey";
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data, 0, KEY_ALL_ACCESS, &key))
{
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\Microsoft\Windows\CurrentVersion\run\Subkey", 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS)
{
printf("创建失败!n");
return 0;
}
if (RegSetValueExW(key, L" szValueName", 0, REG_SZ, (const unsigned char*)&szValueDate1,231) == ERROR_SUCCESS)
{
printf("创建REG_SZ键值成功!n");
}
else
{
printf("创建REG_SZ键值失败!n");
return 0;
}
if (ERROR_SUCCESS == ::RegDeleteValue(key, L"szValueName")) //删除
{
printf("删除成功!");
}
}
else {
printf("fail to get regedit!n");
}
::RegCloseKey(key);
}四.实验截图 4.1 打开/关闭注册表句柄:
4.2 创建/删除子键: 4.3 创建/删除键值项:五.实验心得
刚开始接触注册表编程时很困惑,因为不知道到底要干什么,通过查询相关知识,我发现注册表编程其实就是通过程序完成一些我们平时手动在可视化界面完成的操作,比如创建新键,子键,删除子键,查看键值等,但是由于第一次学习这方面知识,所以还非常的生疏,对一些关键点还不清楚,不太明白输入值类型以及为什么要这么设置,以后还要继续学习!



