c++注册表编辑

来源:互联网 发布:笑声音效软件 编辑:程序博客网 时间:2024/06/05 00:21

第五十三个RegCreateKeyEx在注册表里创建一个子键,或获取一个子键的句柄
在这里我们先来了解一下注册表的基本概念,打开运行对话框,输入regedit,然后回车,便打开了注册表编辑器,首先映入眼前的,便是五个根键
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USER
HKEY_CURRENT_CONFIG

在根键下面便是主键了,如HKEY_CURRENT_CONFIG根键下有两个主键,分别是Software和System(可能会不一样),那么主键下面是什么呢,对了,就是跟 RegCreateKeyEx函数相关的子键,子键下面就是具体的键值项了,但也可以又是子键。键值有五种可选类型,分别是:字符串值(REG_SZ),二进制值(REG_BINARY),DWORD值(REG_DWORD),多字符串值(REG_MULTI_SZ)和可扩充字符值(REG_EXPAND_SZ)。键值项还有其它信息,它的名称,数据。

了解了上面这些东西,接着就来了解下RegCreateKeyEx函数的各个参数吧,先来看一下函数定义:

LONG RegCreateKeyEx (

    HKEY hKey,//根键句柄,指明要在哪个根键下创建子键,填根键名既可
    LPCSTR lpSubKey,//子键名,包含完整路径名
    DWORD Reserved,.//一般取0
    LPSTR lpClass,//一般取NULL
    DWORD dwOptions,//创建子键时的选项,可选值REG_OPTION_NON_VOLATILE,REG_OPTION_VOLATILE,这里取0既可
    REGSAM samDesired,//打开方式,填KEY_ALL_ACCESS,在任何情况都行。
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指定继承性,还是取0
    PHKEY phkResult,//子键对应句柄,待创建或打开的子键句柄将存储在该句柄里
    LPDWORD lpdwDisposition//打开还是创建子键,对应REG_CREATED_NEW_KEY和REG_OPENED_EXISTING_KEY
    );

在这里举一个例子,以便我们能更好的理解该函数。

在HKEY_CURRENT_CONFIG根键下的Software主键里创建一个名为MySelf的子键。

#include<windows.h>int main(){  HKEY hroot;//子键句柄 DWORD dwDisposition;//对应着最后一个参数 RegCreateKeyEx(HKEY_CURRENT_CONFIG,"Software\\MySelf",0,NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);  return 0;}


第五十四个RegSetValueEx根据子键句柄在其下创建或修改一个键值

函数定义:LONG RegSetValueEx(
  HKEY hKey,           // 子键句柄
  LPCTSTR lpValueName, // 键值名称,如果提供的子键下没有该名称,则创建
  DWORD Reserved,      // 保留,填0
  DWORD dwType,        // 键值类型,
  CONST BYTE *lpData,  // 键值的数据
  DWORD cbData         // 键值的数据的大小
);

接着我们以增加开机自启动为例,来看一下函数是如何创建一个键值的,我们知道,像程序添加开机自启动一般都在

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run下添加一个键值,键值类型为二进制(REG_SZ),而键值的数据就为要自启动程序的路径。

假设e盘下有一个AutoRun.exe的应用程序,让电脑开机时自动运行它。

#include<windows.h>int main(){  HKEY hroot;//子键句柄  DWORD dwDisposition;  RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,   NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);  RegSetValueEx(hroot,"AutoRun",0,REG_SZ,(BYTE *)"e:\\AutoRun.exe",sizeof("e:\\AutoRun.exe"));  return 0;}


第五十五个RegDeleteValue根据子键句柄删除其下的一个键值

这里直接举一个例子,删除RegSetValueEx函数创建的键值

#include<windows.h>
int main()
{
  HKEY hroot;//子键句柄
  DWORD dwDisposition;
  RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,
   NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);
  RegDeleteValue(hroot,"AutoRun");//删除子键下名为AutoRun的键值
  return 0;
}

第五十六个RegQueryValueEx根据子键句柄获取一个键值数据,类型。

函数定义:LONG
RegQueryValueEx (
    HKEY hKey,//根键句柄
    LPCWSTR lpValueName,//键值名称
    LPDWORD lpReserved,//预留,填0
    LPDWORD lpType,//接收键值类型
    LPBYTE lpData,//接收键值数据
    LPDWORD lpcbData//接收数据的大小
    );

例子,获取RegSetValueEx函数创建的键值的类型,数据

#include<windows.h>#include<stdio.h>int main(){  char Data[52];  DWORD Size,Type;  HKEY hroot;//子键句柄  DWORD dwDisposition;  RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,   NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);//获取根键句柄  RegQueryValueEx(hroot,"AutoRun",0,&Type,(BYTE *)Data,&Size);//获取AutoRun的信息  printf("键值名称:AutoRun ");   switch(Type)   {   case REG_SZ:printf("键值类型:REG_SZ");break;   case REG_BINARY:printf("键值类型:REG_BINARY");break;   case REG_DWORD:printf("键值类型:REG_DWORD");break;   case REG_MULTI_SZ:printf("键值类型:REG_MULTI_SZ");break;   case REG_EXPAND_SZ:printf("键值类型:REG_EXPAND");break;   }   printf(" 键值数据:%s  %d\n",Data,Size);  return 0;}


第五十七个RegEnumValue根据子键句柄返回对应索引的键值信息(名称,数据,类型,子键下第一个键值索引为0,以此类推,函数成功执行返回ERROR_SUCCESS)

函数定义:LONG
RegEnumValue (
    HKEY hKey,//子键句柄
    DWORD dwIndex,//键值索引
    LPWSTR lpValueName,//接收键值名称,字符数组
    LPDWORD lpcbValueName,//指明数组大小
    LPDWORD lpReserved,//预留,0
    LPDWORD lpType,//键值类型,填NULL,不获取
    LPBYTE lpData,//键值数据,填NULL,不获取
    LPDWORD lpcbData//接收数据的大小,如果键值数据那项参数为NULL,则该项也为NULL
    );

例子:输出Run下的所有键值名

#include<windows.h>#include<stdio.h>int main(){  char Name[52];  int Index=0;  DWORD dwSize=52;  DWORD Size,Type;  HKEY hroot;//子键句柄  DWORD dwDisposition;  RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,   NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);//获取根键句柄  while(RegEnumValue(hroot,Index,Name,&dwSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)  {   printf("%s\n",Name);   Index++;//索引从0开始每次自增一,函数如果执行失败,则索引已到头  }  return 0;}


其实也还可以扩充一下,可以像msconfig程序那样列出当前计算机的所有开机自启动程序,当然,注册表也不只就前面的那一个子键下可以添加自启动程序,在HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run下也可以添加,所以这些子键都需要去查看,更多添加自启动程序的子键可以到百度里去搜一下,大家如果掌握前面那几个注册表操作函数,可以结合起来试着做一个可以添加,查看,删除开机自启动程序的小程序。


例子:将war3的分辨率设置为1366*768

#include "stdafx.h"#include <iostream>#include "windows.h"using namespace std;int main(){cout <<"将寒冰王座的分辨率设置为1366*768"<<endl;HKEY hroot;//子键句柄DWORD width=1366;DWORD height =768;  DWORD dwDisposition;  RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Blizzard Entertainment\\Warcraft III\\Video",0, NULL,0,KEY_ALL_ACCESS,NULL,&hroot,&dwDisposition);  RegSetValueEx(hroot,"reswidth",0,REG_DWORD,(BYTE*)&width,sizeof(DWORD));  RegSetValueEx(hroot,"resheight",0,REG_DWORD,(BYTE*)&height,sizeof(DWORD));  cout <<"注册表已经写入"<<endl;  system("PAUSE");  return 0;}


0 0
原创粉丝点击