(完整版)注册表编程设计(C++)
- 格式:doc
- 大小:59.01 KB
- 文档页数:9
(2)C语言注册表操作实例C语言注册表操作实例例子1:#include <stdio.h>#include <windows.h>int main(void){charregname[]="Software\\Microsoft\\Windows\\CurrentVersion\\R un";HKEY hkResult;intret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult);ret=RegSetValueEx(hkResult,"hacker",0,REG_EXPAND_SZ,(un signed char *)"%systemroot%\\hacker.exe",25);if(ret==0){printf("success to write run key\n");RegCloseKey(hkResult);}else {printf("failed to open regedit.%d\n",ret);return 0;}char modlepath[256];char syspath[256];GetModuleFileName(0,modlepath,256);//取得程序名字GetSystemDirectory(syspath,256);ret=CopyFile(modlepath,strcat(syspath,"\\hacker.exe"),1);if(ret){printf("%s has been copyed to sys dir %s\n",modlepath,syspath);}else printf("%s is exisis",modlepath);return 0;}例子2:#include <windows.h >#include <stdio.h >void main(){HKEY hKey;char SubKeyName[] = "SOFTWARE\\Microsoft\\I nternet Explorer\\Security ";char ValueName[] = "BlockXBM ";BYTE ValueData[64];DWORD Buffer;//打开if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKeyName,0 ,KEY_ALL_ACCESS,&hKey) != ERROR_SUCCESS) {printf( "Error: Regedit cannot be opened! ");}else{//读原来的键值Buffer = sizeof (ValueData);if (RegQueryValueEx(hKey,ValueName,0,NULL,ValueDat a,&Buffer) != ERROR_SUCCESS){//不存在//新建一个值为0的DWORDDWORD temp = 0;if (RegSetValueEx(hKey,ValueName,0,REG_DWORD,(LPB YTE)&temp,sizeof(DWORD)) != ERROR_SUCCESS) {printf( "Error: Create Value failed ");}RegCloseKey(hKey);}else{//存在//改变值DWORD temp = 0;if (RegSetValueEx(hKey,ValueName,0,REG_DWORD,(LPB YTE)&temp,sizeof(DWORD)) != ERROR_SUCCESS) {printf( "Error: Change Value failed ");RegCloseKey(hKey);}}}}用C语言操作注册表以及上一篇的WinApi操作注册表之外还可以用MFC提供的 CRegKey 类以及 CWinApp提供的SetRegistryKey 函数SetRegistryKey 这个函数功能是设置MFC程序的注册表访问键,并把读写ini 文件的成员函数映射到读写注册表。
注册表编程简谈(特别推荐)另附做注册表补丁绝招注册表本身只是一个计算机管理的工具,其实也无所谓编程。
语法也是非常的简单,今天就来给大家讲讲注册表编程。
▪注册表的语法如下:▪RegistryEditorVersion 编辑器版本▪Blank line 空行▪[RegistryPath1] 路径▪"DataItemName1"="DataType1:DataValue1"左边为项,右边为键值。
▪DataItemName2"="DataType2:DataValue2"▪Blank line 空行▪[RegistryPath2] 同上▪"DataItemName3"="DataType3:DataValue3"注意:RegistryEditorVersion 是“Windows Registry Editor Version 5.00”,xp,win7,2000都一样。
▪RegistryPathx 是存放要导入的第一个值的子项的路径。
请用方括▪DataItemNamex 是要导入的数据项的名称。
如果文件中的数据项▪在注册表中不存在,.reg 文件将添加该数据项及其值。
如果数据▪项存在,.reg 文件中的值将覆盖现有的值。
数据项的名称用引号▪引起来。
数据项名称后紧跟着一个等号(=)。
▪▪号将路径括起来,并用反斜杠将层次结构的各个级别隔开。
▪DataTypex 是注册表值的数据类型,紧跟在等号后面。
对于▪DataValuex 紧跟在冒号(对于REG_SZ,则为等号)后面,并▪且格式必须正确(例如,字符串或十六进制)。
对二进制数据项▪使用十六进制格式注册表的删除:▪要使用.reg 文件删除注册表值,请在.reg 文件中的▪DataItemName 后的等号后放置一个连字符(-)。
例如,要从以下▪注册表项中删除TestValue 注册表值:▪HKEY_LOCAL_MACHINE\Software\Test▪请在.reg 文件中的"TestValue"= 后面放置一连字符。
VC中简单操作注册表本文只是对注册表实现简单的打开、创建、读、写、关闭操作,故只是基本知识的介绍,适合不能熟练使用注册表操作的初级读者。
(我把本文放在这里,其实最主要的目的是怕自己以后忘了,毕竟我也不常用这方面的知识,好不容易弄懂了点点,就赶快存起来,呵呵^_^)一、说明:注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息。
注册表中的值通过其名称标识。
值名称由与键名相同的字符组成。
值本身可以是字符串、二进制数据或者是32位无符号值。
在这里我们主要运用以下技巧:(一)、预定义的注册表键。
注册表包含了几个预定义键:1. HKEY_LOCAL_MACHINE 包含描述计算机及其配置的条目。
其中包括关于处理器、系统主板、内存和已安装的软件和硬件的信息。
2. HKEY_CLASSES_ROOT 是与文档类型和 OLE\COM 相关的信息的支持键。
这个键是 HKEY_LOCAL_MACHINE的从属键。
3. HKEY_USERS 用作默认用户首选设置,也作为单个用户的首选设置。
4. HKEY_CLASSES_USER 是用于当前(登录)用户的相关信息。
5. HKEY_CURRENT_CONFIG 包含了当前系统配置的信息。
6. 还有一个,一般不会出现,只有配置的局域网后才会有。
(二)、VC中两种注册表操作方法在VC中,主要有两种方法可以实现注册表的操作,一是使用MFC封装的类CRegKey,该类包含了14个成员函数,它们可以实现注册表的简单操作(基本的如本文提到的“打开、创建、读、写、关闭”等);二是使用Windows API函数。
当然,对我来说,能使用底层的,那为什么不用呢,毕竟我现在是程序员,使用底层函数,可以移植到更多的开发平台中嘛。
1.所需要头文件:atlbase.h该种方法可以使用类CRegKey中的成员函数来完成。
先包含头文件,再申明一个类对象CRegKey RKey;然后就可以调用成员函数来操作了。
C++注册表操作数据结构注册表由键(或称"项")、⼦键(⼦项)和值项构成.⼀个键就是分⽀中的⼀个⽂件夹,⽽⼦键就是这个⽂件夹中的⼦⽂件夹,⼦键同样是⼀个键.⼀个值项则是⼀个键的当前定义,由名称、数据类型以及分配的值组成.⼀个键可以有⼀个或多个值,每个值的名称各不相同,如果⼀个值的名称为空,则该值为该键的默认值.数据类型注册表的数据类型主要有以下四种:显⽰类型(在编辑器中) 数据类型 说明 REG_SZ 字符串 ⽂本字符串REG_MULTI_SZ 多字符串 含有多个⽂本值的字符串REG_BINARY ⼆进制数 ⼆进制值,以⼗六进制显⽰.REG_DWORD 双字 ⼀个32位的⼆进制值,显⽰为8位的⼗六进制值.各主键的简单介绍HKEY_LOCAL_MACHINE 是⼀个显⽰控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括⽹络和硬件上所有的软件设置.HKEY_CLASSES_ROOT 是系统中控制所有数据⽂件的项.HKEY_USERS 将缺省⽤户和⽬前登陆⽤户的信息输⼊到注册表编辑器HKEY_CURRENT_USER 包含着在HKEY_USERS安全辨别⾥列出的同样信息HKEY_CURRENT_CONFIG 包括了系统中现有的所有配置⽂件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很⽅便的更新注册表,⽽不涉及到多个配置⽂件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.---------------------------------------------------------------------------------------------------------------------------------------------------参考⽹页/kzloser/archive/2012/11/07/2758404.html添加开机启动程序#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <strings.h>#include <windows.h>#include <cstdlib>using namespace std;int main(){HKEY hKey;LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";DWORD state,dwtype,sizeBuff;long lRet;char reBuff[10] = {0};cout<<"输⼊0或者1.执⾏操作.1插⼊0删除"<<endl;int operatorNum;cin>>operatorNum;cout<<operatorNum<<endl;cout<<"======================================================================="<<endl;/**LONG RegCreateKeyEx(HKEY hKey, // 主键名称LPCWSTR lpSubKey,// ⼦键名称或路径DWORD Reserved, //0 保留字段,默认设置为0LPWSTR lpClass, // ⼀般设置为NULLDWORD dwOptions, //对你建⽴的键的⼀些选项,可以是这些值:REG_OPTION_NON_VOLATILE,REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE第⼀个是默认的了。
用Visual C++实现注册表简单操作Windows的注册表中包含了Windows的系统配置、PC机的硬件配置、Win32应用程序和用户的其他设置信息。
注册表和INI文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目。
在注册表中键可以包括子键和值。
我们可以对他做个比喻,键就是目录,而子键和值可以看成文件,这样比喻可能不科学但是很实际。
在Windows 98下注册表包括在两个文件内,他们是user.dat和system.dat两个文件。
System.dat包括标准的系统信息,他们被保存在HKEY_LOCAL_MACHINE的根键内。
User.dat文件包括用户指定的信息,如用户策略,桌面设定等等。
为了平时查看方便,Windows为我们准备了一个小程序regedit.exe。
执行他就可以看到注册表的树状结构。
在实际编程工作中,我们经常会遇到如何在Visual C++中对Windows 注册表整个树状结构信息进行访问和修改的问题,如查询和修改注册表中用户姓名和公司名称的有关信息等。
为此,本实例将相关的注册表操作封装到函数中,并通过一个简单的例程给出了上述函数的调用方法,该例程可以在注册表中创建、删除、显示一个键值,同时还可以清空最近阅读过的文档历史记录。
程序的界面效果如图一所示:图一、操作注册表示例程序界面效果图一、实现方法对注册表的编程要用到句柄,我们需要通过一个句柄访问注册表键值,当打开或创建一个键值的时候,会返回一个该键的句柄,并且调用和分析键和创建键值,在分析和创建的同时需要传递句柄到函数。
WINDOWS提供预定义的用语---根一级键的保留句柄,如HKEY_CLASS_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USE R等,这些都是与注册表的根键相对应并且同名的句柄。
当访问一个根键的时候,传递这些通用句柄。
c++操作注册表1. 注册表简介注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应⽤程序设计的数据⽂件,⽤于存储系统和应⽤程序的设置信息。
16位驱动在Winnt (Windows New Technology)下⽆法⼯作,所以所有设备都通过注册表来控制,⼀般这些是通过BIOS(基本输⼊输出系统)来控制的。
在Win95下,16位驱动会继续以实模式⽅式设备⼯作,它们使⽤system.ini来控制。
16位应⽤程序会⼯作在NT或者Win95 下,它们的程序仍然会参考win.ini和system.ini⽂件获得信息和控制。
2. 注册表结构2.1. 简介注册表是是Microsoft Windows中的⼀个重要⽽⼜复杂的信息数据库,它是多层次式的。
在不同系统上注册表的基本结构相同。
其中的复杂数据会在不同⽅式上结合,从⽽产⽣出⼀个绝对唯⼀的注册表。
从⽤户的⾓度看,注册表系统由两个部分组成:注册表数据库和注册表编辑器。
注册表数据库包括两个⽂件:system.dat和user.dat。
system.dat⽤来保存微机的系统信息,如安装的硬件和调和驱动程序的有关信息等。
user.dat⽤来保存每个⽤户特有的信息,如桌⾯设置、墙纸或窗⼝的颜⾊设置等。
由于注册表是最重要的系统⽂件之⼀,因此对于它的保护和备份就特别重要。
系统在每次成功启动之后都将此次启动时的注册表作⼀个备份。
system.dat的备份⽂件为system.dao,user.dat的备份⽂件为user.dao。
如果由于某种原因注册表受到破坏,则可以⽤这两个备份⽂件来恢复注册表。
Win 98/Win Me备份的注册表⽂件保存在C:/WINDOWS/SYSBCKUP⽂件夹(这是个隐藏⽂件夹)中,⽂件名称是rb000.cab、rb002.cab、rb003.cab、rb004.cab、rb005.cab(通常为五个)。
2.2. 数据结构注册表由键(或称“项”)、⼦键(⼦项)和值项构成。
用VC++操作注册表作者:佚名来源:InterNet 加入时间:2005-2-17相关文章:∙让WinX P注册表“失忆”更简单∙修改注册表清除黑客程序∙调整WinXP注册表∙修改注册表让Win 98更安全∙注册表的另类调用方法∙修改注册表设置高亮字体∙注册表修复不成功的原因∙利用注册表管理IP地址∙利用注册表保护打印机∙Windows系统注册表知识完全揭密相关书籍:∙注册表使用大全∙WINDOWS 2000注册表管理∙注册表实用手册(02年4月最新版!)注册表是Windows操作系统的数据库 它里面存着Windows启动和执行各种程序所需要的重要数据 我们经常要修改注册表对系统进行优化好满足我们不同的需要。
在编写程序的过程中 我们有时候也要修改注册表,好实现某种功能。
其实微软为我们设计了一系列API函数我们可以通过调用这些函数来执行修改注册表的功能。
在这里向大家介绍两个经常要使用的函数,RegCreateKeyEx函数可以打开注册表,并且打开指定的子键,如果该键不存在就创建它。
这个函数经常用来在注册表增加新的子键。
RegSetValueEx函数用来向注册表里写数据它经常用来修改键值。
下面我们编写一个例子程序来说明这两个函数的具体用法.我们使用VC++6.0来写这个程序。
打开VC++6.0,使用MFC AppWizard新建一个基于对话框的工程,工程名为zhucebiao,在对话框上加上一个button控件,标题为“修改注册表”,在MFC ClassWizard中添加一个当我们使用鼠标单击这个控件时响HKEY hKeyDWORD dwDiplong ret= RegCreateKeyEx HKEY_LOCAL_MACHINE _T ″SOFTWARE\\选中文字″ 0l NULL REG_OPTION_VOLATILE KEY_ALL_ACCESS NULL &hKey &dwDipCString str=″aaaaaaa″DWORD leng=str.GetLength +1LPBYTE lpb=new BYTE str.GetLength +1for int i=0;i<str.GetLength;i++lpb i=str ilpb str.GetLength=0//使用RegSetValueEx函数为新建的子键设置键值第1个参数为打开的代表该子键的句柄,第2个参数是子键名称,NULL代表修改默认值,第3个参数保留这里写NULL,第4个参数代表要设置的数据类型,这里是REG_SZ 代表写入的是字符串 第5个参数是写入的数据长度。
1.注册表基础注册表的组织方式跟文件目录比较相似,主要分为根键、子键和键值项三部分,与文件目录对应的话就是根目录、子目录和文件。
分别介绍一下这三部分:(1)根键。
分为5个,分别为HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS和HKEY_CURRENT_CONFIG,把它们理解成磁盘的五个分区可以了。
(2)子键。
可以有多个子键和键值项,就像一个目录中可以有多个子目录和多个文件一样。
(3)键值项。
可以理解为文件,它由三部分组成,分别为:名称、类型、数据。
类型又分为多种主要包括如下:REG_BINARY 二进制数据REG_DWORD 32位双字节数据REG_SZ 以0结尾的字符串REG_DWORD_BIG_ENDIAN 高位排在底位的双字REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%REG_LINK UNICODE 符号链接REG_RESOURCE_LIST 设备驱动程序资源列表REG_MULTI_SZ 多字符串注册表数据项的数据类型有8种,但最常用的主要是前3种。
有了这些基础下面我们讨论如何编程实现对注册表的操作。
2.打开/关闭注册表句柄在对注册表操作前应该先打开指定的键,然后通过键的句柄进行操作,打开键句柄可以用API RegOpenKeyEx来实现,其原形如下:RegOpenKeyEx(hKey,//父键句柄lpSubKey,//子键句柄dwOptions,//系统保留,指定为0samDesired,//打开权限phkResult,//返回打开句柄);其中打开权限有多种,想方便的话可以指定为KEY_ALL_ACCESS ,这样什么权限都有了,当函数执行成功时返回ERROR_SUCCESS。
其实例代码如下:HKEY key;LPCTSTR data="SOFTWARE\Microsoft\Windows\CurrentVersion\Run";if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)...{/**//*需要执行的操作...*/}::RegCloseKey(key);要注意的是,在使用后应该调用RegCloseKey()函数关闭句柄.3.获取子键/键值信息在现实的编程操作中我们常常需要获取子键/键值的信息比如:子键/键值的数量,长度,以及数据的最大长度等等,这些信息可以通过RegQueryInfoKey函数来获取。
它的原型如下:RegQueryInfoKey(hkey,//要获取信息的句柄lpClass,//接受创建健时的Class字符串lpcbClass,//lpClass的长度lpReserved,//系统保留,指定为0lpcSubKeys,//子键数量lpcbMaxSubKeyLen,//子键中最长名称的长度lpcbMaxClassLen,//子键中最长Class字符串长度lpcVlaues,//键值数量lpcbMaxV alueNameLen,//键值项中最长名称的长度lpcbMaxV alueLen,//键值项数据最大长度lpcbSecurityDescriptor,//安全描述符长度lpftLastWriteTime,//FILETIME结构,最后修改时间);这个函数的参数很多,实际使用时,只填写自己需要的就行了,不需要的可以放个NULL 就OK了,还有一点需要注意就是它所返回的长度都不包括结尾的0字符,所以在使用时应该用长度+1。
其实例代码如下:DWORD dwIndex=0,NameSize,NameCnt,NameMaxLen,Type;DWORD KeySize,KeyCnt,KeyMaxLen,DateSize,MaxDateLen;if(RegQueryInfoKey(key,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS)...{printf("RegQueryInfoKey错误");return;}用的时候套用格式就成了。
有了这些信息我们就可以枚举子键和键值的信息了。
4.枚举子键信息枚举子键可以用API函数RegEnumKeyEx来实现,调用RegEnumKeyEx时将返回子键的名称、长度和一些相关数据。
如果想得到一个键下的全部子键的话应该循环调用,直到返回ERROR_NO_MORE_ITEMS为至,就说明已经枚举完了所有数据。
其函数原型如下:RegEnumKeyEx(hkey,//被枚举的键句柄dwIndex,//子键索引编号lpName,//子键名称lpcbName,//子键名称长度lpReserved,//系统保留,指定为0lpClass,//子键类名lpcbClass,//子键类名长度lpftLastWriteTime//最后写入时间);因为在之前我们已经通过RegQueryInfoKey函数获取了键的有关数据,所以在这里不再跟据ERROR_NO_MORE_ITEMS来实现了。
其实现代码如下:for(dwIndex=0;dwIndex<KeyCnt;dwIndex++) //枚举子键...{KeySize=KeyMaxLen+1; //因为RegQueryInfoKey得到的长度不包括0结束字符,所以应加1szKeyName=(char*)malloc(KeySize);/**//*参数定义请参照获取子键/键值信息部分...*/RegEnumKeyEx(hKey,dwIndex,szKeyName,&KeySize,NULL,NULL,NULL,NULL);//枚举子键printf(szKeyName);}最后需要注意的是在每次调用RegEnumKeyEx前必须重新将KeySize的值设为KeyMaxLen 缓冲区的大小,因为每次函数返回时KeySize的值会变成返回的键值的名称长度,随着循环次数这个值会变小,而可能出现无法枚举所有键值项的情况。
5.枚举键值信息枚举键值信息的方法与枚举子键信息极为相似,可以用RegEnumValue函数实现,其函数原型如下:RegEnumValue(hkey,//被枚举的键句柄dwIndex,//子键索引编号lpValueName,//键值名称lpcbValueName,//键值名称长度lpReserved,//系统保留,指定为0lpType,//键值数据类型lpDate,//键值数据lpcbDate //键值数据长度);其实现代码如下:for(dwIndex=0;dwIndex<NameCnt;dwIndex++) //枚举键值...{DateSize=MaxDateLen+1;NameSize=NameMaxLen+1;szValueName=(char *)malloc(NameSize);szValueDate=(LPBYTE)malloc(DateSize);/**//*参数定义请参照获取子键/键值信息部分...*/RegEnumValue(hKey,dwIndex,szValueName,&NameSize,NULL,&Type,szValueDate,&DateSize);//读取键值if(Type==REG_SZ)...{/**//*判断键值项类型并做其它操作......*/}if(Type==REG_DWORD)...{}}与枚举子键相似,在每次循环中应该重新设置数据长度DateSize=MaxDateLen+1,键值名称长度NameSize=NameMaxLen+1。
6.创建/删除子键创建子键跟打开子键差不多,可以用RegCreateKeyEx函数来实现,其原型如下:RegCreateKeyEx(hkey,//父键句柄lpSubKey,//子键句柄Reserved,//系统保留,指定为0lpClass,//定义子键类名,通常设为NULLdwOptions,//创建子键时的选项samDesired,//创建后操作权限lpSecurityAttributes,//指向SECURITY_ATTRIBUTES结构,指定键句柄的继//承性phkResult,//返回创建句柄lpdwDisposition //通常设为NULL);创建子键也可以用16位下的API函数RegCreateKey来实现。
其实例代码如下:HKEY KEY;if (ERROR_SUCCESS!=RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\MyKey",&KEY))...{MessageBox("创建失败!");}else...{MessageBox("创建成功!");};删除一个键可以用RegDeleteKey()实现,它有两个参数原型如下:RegDeleteKey(hkey,//主键句柄lpSubKey,//子键名称字符串);如果想删除上面创建的MyKey子键可以用下面的代码实现:if(ERROR_SUCCESS==RegDeleteKey(HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\MyKey"))...{AfxMessageBox("删除成功!");}else...{AfxMessageBox("删除失败!");}需要注意的是,在创建子键时可以创建多级子键,比如:RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\MyKey1\MyKey2",&KEY);如果MyKey1不存在的话,那么它将先创建MyKey1,再创建MyKey2,这一点与文件系统中创建目录是不同的。
但是删除的时候却不能删除多级子键。
比如想删除MyKey1,那么必须先删除MyKey2才可以。
不过一个子键下面的多个键值可以一次删除。
7.创建/删除键值项创建键值可以用RegSetValueEx函数来实现,它的原型如下:RegSetValueEx(hkey,//键句柄,键值项将保存在此键下lpValueName,//键值项名称Reserved,//系统保留,指定为0dwType,//键值项类型lpDate,//键值项数据cbDate //键值项长度);使用这个函数的时个有一点需要注意,其中参数lpDate和cbDate的值要跟据dwType 的值来设定,按常用设置我们分三种情况(1)当dwType为REG_SZ时,这时跟通常一样,lpDate为要设置的数据,cbDate为数据的长度。