注册表操作:添加键值、删除键值、删除子键

时间:2022-09-04 23:32:54
#include <windows.h>
#include <stdio.h>

int main()
{
//找到系统的启动项
WCHAR szSubKey[1024]= L"Software\\Microsoft\\Windows\\CurrentVersion\\run";
//要添加到注册表中的键值
WCHAR szModule[1024]=L"C:\\Users\\hello\\AppData\\Local\\Temp\\test.exe";

DWORD m_type=REG_SZ;
WCHAR m_name[1024]={0},m_mytestsname[1024]={0};
DWORD m_namelen=1024*sizeof(WCHAR);
DWORD m_mytestsnamelen=1024*sizeof(WCHAR);
DWORD m_index=0;
HKEY hKey;
//打开注册表启动项
if(RegOpenKeyExW(HKEY_CURRENT_USER, szSubKey, 0, KEY_WRITE|KEY_READ|KEY_QUERY_VALUE|KEY_ALL_ACCESS, &hKey)== ERROR_SUCCESS)
{
//添加一个键值,“Mytests”是键值的名称(可任意命名),REG_SZ是键值的类型,szModule代表的是键值的值。
if(RegSetValueExW(hKey, L"Mytests", 0, REG_SZ, (BYTE *)szModule, sizeof(szModule))!=ERROR_SUCCESS)
{
printf("Error Code:%d",GetLastError());
return -1;
}

/*
//RegEnumKeyExW枚举是用在Run这一层的,也就是key值,不能用来查询"Mytests"
//RegEnumValueExW用来枚举键值
while(RegEnumKeyExW(hKey,m_index,m_name,&m_namelen,0,NULL,NULL,0)!=ERROR_SUCCESS)
{
}
*/

//查询键值
if(RegQueryValueExW(hKey,L"Mytests",0,&m_attr,LPBYTE(m_mytestsname),&m_mytestsnamelen)==ERROR_SUCCESS)
{
printf("%s",m_mytestsname);//这行只能输出第一个字符C,如果输出格式为"%ls"则输出结果相同
wprintf(L"%ls\r\n",m_mytestsname);//这行可以输出整个字符串C:\Users\hello\AppData\Local\Temp\QQ_File_Software.exe
}

//下面的可以成功删除键值
if(RegDeleteValueW(hKey,L"Mytests")!=ERROR_SUCCESS)
{
printf("Error Code:%d",GetLastError());
return -1;
}
RegCloseKey(hKey);

//测试删除子键
WCHAR szSubKey1[1024]= L"Software\\Microsoft\\Windows\\CurrentVersion\\run";
HKEY hKey1;
if(RegOpenKeyExW(HKEY_CURRENT_USER, szSubKey1, 0, KEY_WRITE|KEY_READ|KEY_QUERY_VALUE|KEY_ALL_ACCESS, &hKey1) != ERROR_SUCCESS)
{
return -1;
}
if(RegDeleteKeyW(hKey1,L"NewKey")!=ERROR_SUCCESS)
{
printf("Error Code:%d",GetLastError());
return -1;
}
RegCloseKey(hKey1);
}
else
{
return -1;
}
}