C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++注册表操作

C/C++实现Windows注册表的基本操作

作者:微软技术分享

Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库,本文主要为大家介绍了C++对注册表的基本操作,感兴趣的小伙伴可以了解下

Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。

以下是注册表的一些基本概念:

Windows注册表的作用包括:

枚举注册表项

RegOpenKeyEx 是一个用于打开指定的注册表键的 Windows API 函数。它允许应用程序访问和操作 Windows 注册表的子键。在较新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx 已被推荐的函数 RegOpenKey 和 RegOpenKeyEx 代替。以下是 RegOpenKeyEx 的一般用法:

LSTATUS RegOpenKeyEx(
  HKEY    hKey,
  LPCTSTR lpSubKey,
  DWORD   ulOptions,
  REGSAM  samDesired,
  PHKEY   phkResult
);

参数说明:

函数返回值:

RegEnumValue 用于列举指定注册表键中的值。它可以用来遍历注册表键中的所有值,以便你可以获取键中包含的信息。以下是 RegEnumValue 的一般用法:

LSTATUS RegEnumValue(
  HKEY    hKey,
  DWORD   dwIndex,
  LPTSTR  lpValueName,
  LPDWORD lpcchValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

参数说明:

函数返回值:

枚举指定键值对中是否存在值,如果存在则循环将其输出。

#include <stdio.h>
#include <Windows.h>

void Enum_Regedit(HKEY Reg_Root,const char *Reg_Path)
{
  HKEY hKey = NULL;
  DWORD dwType = 0;
  char szValueName[MAXBYTE], szValueKey[MAXBYTE] = { 0 };
  DWORD dwBufferSize = MAXBYTE, dwKeySize = MAXBYTE;

  // 打开注册表项
  LONG lRet = RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);

  int index = 0;
  while (1)
  {
    // 枚举注册表键项
    lRet = RegEnumValue(hKey, index, szValueName, &dwBufferSize, NULL,
      &dwType, (unsigned char *)szValueKey, &dwKeySize);

    if (lRet == ERROR_NO_MORE_ITEMS)
      break;

    printf("序号: %3d 名称: %-25s 值: %-50s 类型: ", index, szValueName, szValueKey);
    switch (dwType)
    {
    case 1: printf("REG_SZ \n"); break;
    case 2: printf("REG_EXPAND_SZ \n"); break;
    case 4: printf("REG_DWORD \n"); break;
    case 7: printf("REG_MULTI_SZ \n"); break;
    default: printf("None \n"); break;
    }
    dwBufferSize = MAXBYTE;
    dwKeySize = MAXBYTE;
    index++;
  }
  RegCloseKey(hKey);
}

int main(int argc, char *argv[])
{
  // 枚举普通启动项
  Enum_Regedit(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");
  Enum_Regedit(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");

  // 枚举Boot启动项
  // HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute
  Enum_Regedit(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\");

  // 枚举ActiveX启动项,在子键中添加SubPath即可完成开机自启动.
  Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\");

  system("pause");
  return 0;
}

添加注册表项

RegCreateKey 是用于创建或打开指定的注册表键。如果键不存在,则它将被创建;如果存在,则它将被打开。以下是 RegCreateKey 的一般用法:

LSTATUS RegCreateKey(
  HKEY    hKey,
  LPCTSTR lpSubKey,
  PHKEY   phkResult
);

参数说明:

函数返回值:

RegSetValueEx 是用于在指定的注册表键中设置一个值。它可以用于创建新的键值,也可以用于修改现有键值。以下是 RegSetValueEx 的一般用法:

LSTATUS RegSetValueEx(
  HKEY       hKey,
  LPCTSTR    lpValueName,
  DWORD      Reserved,
  DWORD      dwType,
  const BYTE *lpData,
  DWORD      cbData
);

参数说明:

函数返回值:

通过获取自身进程名称,并将该进程路径写入到CurrentVersion变量中实现开机自启。

#include <stdio.h>
#include <Windows.h>

#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"

BOOL Reg_Regedit(HKEY Reg_Root,char *lpszFileName, char *lpszValueName)
{
  HKEY hKey;
  if (ERROR_SUCCESS != RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_WRITE, &hKey))
  {
    return FALSE;
  }
  if (ERROR_SUCCESS != RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
  {
    RegCloseKey(hKey);
    return FALSE;
  }
  RegCloseKey(hKey);
  return TRUE;
}

int main(int argc, char *argv[])
{
  TCHAR szPath[MAX_PATH] = { 0 };
  if (GetModuleFileName(NULL, szPath, MAX_PATH))
  {
    int ret = Reg_Regedit(HKEY_CURRENT_USER, szPath, "main");
    if (ret == 1)
      printf("添加自身启动项成功 \n");
  }

  system("pause");
  return 0;
}

注册表项不仅可以实现开机自启动,由于Win系统都是在注册表之上工作的,只要向指定位置写入键值,即可实现许多不可思议的功能。

// 禁用系统任务管理器
void RegTaskmanagerForbidden()
{
  HKEY hkey;
  DWORD value = 1;
  RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
  RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
  RegCloseKey(hkey);
}

// 禁用注册表编辑器
void RegEditForbidden()
{
  HKEY hkey;
  DWORD value = 1;
  RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
  RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
  RegCloseKey(hkey);
}

// 干掉桌面壁纸
void RegModifyBackroud()
{
  DWORD value = 1;
  HKEY hkey;
  RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
  RegSetValueEx(hkey, "Wallpaper", NULL, REG_SZ, (unsigned char *)"c://", 3);
  RegSetValueEx(hkey, "WallpaperStyle", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
}

判断键值状态

RegQueryValueEx 是用于检索指定注册表键中的指定值。它可以用来获取注册表键中的数据,例如字符串、整数等。以下是 RegQueryValueEx 的一般用法:

LSTATUS RegQueryValueEx(
  HKEY    hKey,
  LPCTSTR lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

参数说明:

函数返回值:

判断指定键值对是否存在,是否被设置过.

#include <stdio.h>
#include <Windows.h>

#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"

BOOL Check_Regedit(HKEY Reg_Root,char * name)
{
  HKEY hKey;
  if (ERROR_SUCCESS == RegOpenKeyEx(Reg_Root, Reg_Path, NULL, KEY_ALL_ACCESS, &hKey))
  {
    DWORD dwSize = 255, dwType = REG_SZ;
    char String[256];
    if (ERROR_SUCCESS == RegQueryValueEx(hKey, name, 0, &dwType, (BYTE *)String, &dwSize))
    {
      return true;
    }
  }
  RegCloseKey(hKey);
  return false;
}

int main(int argc, char *argv[])
{
  int ret = Check_Regedit(HKEY_CURRENT_USER, "ctfmon");
  printf("启动项存在: %d \n", ret);

  system("pause");
  return 0;
}

删除键值对

RegDeleteValue 是用于删除指定注册表键中的指定值。它可以用来删除注册表键中的数据值。以下是 RegDeleteValue 的一般用法:

LSTATUS RegDeleteValue(
  HKEY    hKey,
  LPCTSTR lpValueName
);

参数说明:

函数返回值:

传入需要删除的注册表位置,以及该表中键值对的名字即可完成删除。

#include <stdio.h>
#include <Windows.h>

void Delete_Regedit(const char *Reg_Path,const char *Key_Name)
{
  char szKeyName[MAXBYTE] = { 0 };
  HKEY hKey = NULL;
  LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);
  RegDeleteValue(hKey, Key_Name);
  RegCloseKey(hKey);
}

int main(int argc, char *argv[])
{
  Delete_Regedit("Software\\Microsoft\\Windows\\CurrentVersion\\Run", "main1");

  system("pause");
  return 0;
}

到此这篇关于C/C++实现Windows注册表的基本操作的文章就介绍到这了,更多相关C++注册表操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文