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;}
- 注册表编辑
- 编辑注册表函数
- wince 注册表编辑
- Win32注册表编辑类
- c++注册表编辑
- c# 注册表编辑
- 常用注册表编辑
- C++编辑注册表
- 制作REG文件编辑注册表
- Reg注册表内容编辑操作
- 用记事本编辑注册表文件
- 禁用开启注册表编辑功能
- 什么是注册表 ,注册表编辑手册之大集合
- WinCE下的注册表编辑程序
- JS和INF编辑注册表(图)
- 应用程序中对注册表的编辑
- 如何手工写.reg编辑注册表文件
- Windows7下无法编辑注册表的问题
- 01_06.padding属性
- 无插件定制web vim开发环境基本版
- $(document).ready() 与window.onload的区别
- 实战Linux Bluetooth编程(四) L2CAP层编程
- ios推送通知设置
- c++注册表编辑
- perl学习--文件copy
- JPA应用小例子
- 经典面试题之单链表找环
- 压缩字符串
- 实战Linux Bluetooth编程(五) Socket与Bluetooth
- photoshop测量
- 第八讲 常用的Web服务器控件(二)
- Java Web项目结构