注册表的操作,API为我们提供了大约25个函数。他提供了对注册表的读取,写入,删除,以及打开注
册表及键值时所有函数,并且可以达到对注册表的备份,连接和对远端注册表进行查看等等。注册表对
整个系统十分重要,你在进行操作时,一定要先考虑清楚。这些函数有:
RegCloseKey RegConnectRegistry RegCreateKey RegCreateKeyEx RegDeleteKey RegDeleteVale
RegEnumKey RegFlushKey RegGetKeySecurity(此函数,98不适用) RegLoadKey
RegNotifyChangeKeyValue(98不适用) RegOpenKey RegOpenKeyEx RegQueryInfoKey
RegQueryValue
RegQueryValueEx RegReplaceKey RegRestoreKey(98不适用) RegSaveKey RegSetKeySecurity
(98不适用) RegSetValue RegSetValueEx RegUnLoadKey
我们对经常使用的几个函数进行介绍。
1·RegClose()
原形:LONG RegCloseKey(
HKEY hKey // 释放已经打开的注册表句柄
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行
保存操作结果。关闭一个键后,句柄变为非法,以使其不可再次被使用。为系统重新使用而释放句柄。
例子
BOOL bRet = TRUE;
if( m_hKey == NULL )
return( FALSE );
bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS );
m_hKey = NULL;
return( bRet );
2·RegCreateKeyEx()和RegCreateKey()
原形:LONG RegCreateKeyEx(
HKEY hKey, // 主键名称
LPCTSTR lpSubKey, // 子键名称或路径
DWORD Reserved, // 保留,为0
LPTSTR lpClass, // 没弄懂,我设为空也差不多
DWORD dwOptions,
/* 对你建立的键的一些选项,可以是这些值:REG_OPTION_NON_VOLATILE,
REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE第一个是默认的了。一般用第一个就可以了。*/
REGSAM samDesired, // 设置你对你建立的这个键的访问权限
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
//不太明白
PHKEY phkResult, // 指向你建的句柄
LPDWORD lpdwDisposition //用来查看是打开一个已经有的键,还是新建了键
);
RegCreateKey()函数简单了不少,请自己看了。
返回值:不成功返回非0,成功返回ERROR_SUCCESS.
解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。当在创建或打开注
册表的键时,需要指定访问权限,而这些访问权限需要到一级。默认的权限是KEY_ALL_ACCESS权限。还
有KEY_CREATE_LINK创建字符链权限,KEY_CREATE_SUB_KEY创建子键权限,KEY_EXECUTE读取键权限,
KEY_NOTIFY获得修改键通知的权限,KEY_QUERY_VALUE查询键值的权限,KEY_SET_VALUE设置数据值的权
限。注意不能在根一级建键,在注册表的根一级仅可有预定义的键。具体使用,请查看联机手册。
例子:
HKEY m_hkey;
DWORD dwDisposition;
long ret0=(::RegCreateKeyEx
(HKEY_CURRENT_USER,"REGD/",0,NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hkey,&dwDisposition));
if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}
if(dwDisposition==REG_OPENED_EXISTING_KEY)
MessageBox("打开了一个已经存在的键");
else
{
if(dwDisposition==REG_CREATED_NEW_KEY)
MessageBox("建立一个新键");
}
RegClosekey(m_hkey);
3·RegOpenKey()和RegOpenKeyEx()
原形:LONG RegOpenKeyEx(
HKEY hKey, // 要打开主键名
LPCTSTR lpSubKey, // 子键或路径
DWORD ulOptions, // 保留,为0
REGSAM samDesired, // 操作权限标志
PHKEY phkResult // 指向你打开键的句柄
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS.
解释:该函数负责打开指定的键或子键,如果不存在他不建立。其他和RegCreateKeyEx()和
RegCreateKey()基本相同。
4·RegDeleteKey()
原形:LONG RegDeleteKey(
HKEY hKey, // 已打开的键的句柄
LPCTSTR lpSubKey // 要删除的子键或路径,传如""将删除key本身
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
该函数用来删除注册表中的一个键值的。在用此函数时需要注意98与NT的差异。在NT中在删除一个键
之前,要求必须删除所有子键,需要从下向上递归删除所有子键,而WINDOWS98没有他那么复杂,只要
删除键及其所有子键就可以啦。
5·RegQueryValue()和RegQueryValueEx()
原形:LONG RegQueryValueEx(
HKEY hKey, // 已打开的键的句柄
LPTSTR lpValueName, // 要查询值的名称,传如""为查询键下的默认值
LPDWORD lpReserved, // 保留,为0
LPDWORD lpType, // 查询的类型
LPBYTE lpData, // 数据存放的地址
LPDWORD lpcbData // 数据长度+1
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:读取某子键下特定名称的值。
例子
CString m_strQ;//用来存放查询来的字符串值
DWORD m_dwCount;//记录字符串的长度+1(包括NULL字符)
::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&m_dwCount);//先查询出字节空间
ret1=(::RegQueryValueEx
(m_hkey,"",0,NULL,(unsigned char *)m_strQ.GetBuffer(m_dwCount),&m_kk));
m_strQ.ReleaseBuffer();
MessageBox(m_strQ);
6·RegSetValue()和RegSetValueEX()
原形:LONG RegSetValueEx(
HKEY hKey, // 已打开的键的句柄
LPCTSTR lpValueName, // 要查询值的名称,传如""为查询键下的默认值
DWORD Reserved, // 保留
DWORD dwType, // 变量的类型
CONST BYTE *lpData, // 变量数据的地址
DWORD cbData // 变量的长度
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:设置某子键下特定名称的值。
7·RegEnumValue()
原形:LONG RegEnumValue(
HKEY hKey, // 要查询的已打开的键的句柄
DWORD dwIndex, // 读取名称的索引号
LPTSTR lpValueName, // 返回所读取的名称
LPDWORD lpcbValueName, // 返回读取名称的长度,不含chr(0)
LPDWORD lpReserved, // 保留,为0
LPDWORD lpType, // 返回所读取的数据类型
LPBYTE lpData, // 返回所读取的数据
LPDWORD lpcbData // 返回所读取的数据长度
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:列出某Key的所有名称的值,变化索引即可遍历整个键下的名称和数据。
8·RegDeleteValue()
原形:LONG RegDeleteValue(
HKEY hKey, // 要删除的键的句柄
LPCTSTR lpValueName // 要删除的名称
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:删除某Key的某一名称
9·RegEnumKey()和RegEnumKeyEx()
原形:LONG RegEnumKeyEx(
HKEY hKey, // 要列举的键的句柄
DWORD dwIndex, // 索引
LPTSTR lpName, // 子键的名称
LPDWORD lpcbName, // 子键名称的长度
LPDWORD lpReserved, // 保留
LPTSTR lpClass, // address of buffer for class string
LPDWORD lpcbClass, // address for size of class buffer
PFILETIME lpftLastWriteTime
// address for time key last written to
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
返回注册表键及其子键的详细信息。
10·RegQueryInfoKey()
原形:LONG RegQueryInfoKey(
HKEY hKey, // 已打开的键的句柄
LPTSTR lpClass, // 类型名称,仅使用于NT。若不使用则传入Null
LPDWORD lpcbClass, // 类型名称的长度
LPDWORD lpReserved, // 保留
LPDWORD lpcSubKeys, // 返回子键的数目
LPDWORD lpcbMaxSubKeyLen, // 返回最长的子键长度
LPDWORD lpcbMaxClassLen, // 返回最长的类长度
LPDWORD lpcValues, // 返回值的数目
LPDWORD lpcbMaxValueNameLen, // 返回最长的值项名称的长度
LPDWORD lpcbMaxValueLen, // 返回最长的值的长度
LPDWORD lpcbSecurityDescriptor, //返回安全描述,仅适用于 NT
PFILETIME lpftLastWriteTime // 返回键最后被写入的时间,仅适用于 NT
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:返回注册表键的信息,包括类名、子键数量、最长子键名、值的数量、最长值数据、安全描述
符的长度以及上一次写入的时间等。
11·RegLoadKey()
原形:LONG RegLoadKey(
HKEY hKey, // 打开的句柄
LPCTSTR lpSubKey, //子键的路径
LPCTSTR lpFile // 要写入注册表信息的文件
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:从指定的文件恢复注册表键的子键信息到注册表。
12·RegReplaceKey()
原形:LONG RegReplaceKey(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey
LPCTSTR lpNewFile, // 在替换前生成新的备份文件
LPCTSTR lpOldFile // 需要覆盖上注册表的文件
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:从指定的文件恢复注册表键的子键信息到注册表并替换原有的值,并生成新的备份文件
13· RegSaveKey()
LONG RegSaveKey(
HKEY hKey, // 要保存的句柄
LPCTSTR lpFile, // 保存子键的文件
LPSECURITY_ATTRIBUTES lpSecurityAttributes //不太懂
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:保存键及其子键信息到指定的文件。
14· RegConnectRegistry()
原形:LONG RegConnectRegistry(
LPTSTR lpMachineName, //远程计算机的名称
HKEY hKey, // 预先注册的句柄
PHKEY phkResult // 远程计算机上的句柄
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:连接到远程系统的注册表。
15·RegNotifyChangeKeyValue()
当修改指定的注册表对象时提供通知。
16· RegUnloadKey()
LONG RegUnLoadKey(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey // address of name of subkey to unload
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
删除注册表键及其所有的子键。
如今修改注册表成为继超频之后的又一大热点,许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都以手工修改为例,极少数文章也只介绍有关修改注册表软件的用法,至于如何在程序中实现却无人提及。为此我在Visual Studio6.0帮助文件中用Registry关键字进行搜索,在翻译软件帮助下及不断的上机实践下,我终于摸索出使用注册表接口(API)函数的一些用法,现拿出来与大家共享。
在程序中使用注册表,不外乎创建、打开、读取、设置、删除这五个常规操作,(要想获得更详细的资料可以参考Visual Studio6.0帮助目录中MSDN Library Visual Studio6.0|Platform SDK|Window Base Services|General Library|Registry条目)。下面我们就来关注这五个接口函数的用法:
一、 创建键RegCreateKeyEx
通过RegCreateKeyEx函数可以在注册表中创建键,如果需要创建的键已经存在了,则打开键。函数原型如下:
LONG RegCreateKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD Reserved,
LPTSTR lpClass,
DWORD dwOptions,
REGSAM samDesired,
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
);
各参数及返回值的含义如下:
·hKey为主键值,可以取下面的一些数值:
HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE
HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系统)
HKEY_DYN_DATA(WIN9X操作系统)
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(/)开始。该参数可以为NULL。
·Reserved保留,必须设置为0。
·参数lpClass一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数。
·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:
REG_OPTION_NON_VOLATILE 新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复)
REG_OPTION_VOLATILE 新创建的键为一个短暂性的键(数据信息保存在内存中)。Windows95忽略该数值。
REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持。
·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:
KEY_CREATE_LINK 准许生成符号键
KEY_CREATE_SUB_KEY 准许生成子键
KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键
KEY_EXECUTE 准许进行读操作
KEY_NOTIFY 准许更换通告
KEY_QUERY_VALUE 准许查询子键
KEY_ALL_ACCESS 提供完全访问,是上面数值的组合
KEY_READ 是下面数值的组合:
KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY
KEY_SET_VALUE 准许设置子键的数值
KEY_WRITE 是下面数值的组合:
KEY_SET_VALUE、KEY_CREATE_SUB_KEY
·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述。
·参数phkResult为一个指向新创建或打开的键的句柄的指针。
·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:
REG_CREATE_NEW_KEY 键先前不存在,现在被创建。
REG_OPENED_EXISTING_KEY 键先前已存在,现在被打开。
·返回值 如果函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage函数来获取一个对错误的总体描述。
二、 打开一个键RegOpenKeyEx
RegOpenKeyEx函数可以打开一个指定的键,函数原型如下:
LONG RegOpenKeyEx(
HKEY hkey,
LPCTSTR lpSubKey,
DWORD ulOption,
REGSAM samDesired,
PHKEY phkResult
);
各参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(/)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄。
·ulOption保留,通常必须设置为0。
·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数。
·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄。
·返回值同RegCreateKeyEx函数的返回值。
三、 读取键RegQueryValueEx
通过RegQueryValueEx函数可以从一个已经打开的键中读取数据,函数原型如下:
LONG RegQueryValueEx(
HKEY hKey,
LPTSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
各个参数及返回值的含义如下:
·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数。
·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针。
·lpReserved保留,必须为NULL。
·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:
REG_BINARY 二进制数据
REG_DWORD 32位整数
REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存
REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存
REG_EXPAND_SZ 一个包含未扩展环境变量的字符串
REG_LINK 一个Unicode类型的链接
REG_MULIT_SZ 以两个零结尾的字符串
REG_NONE 无类型数值
REG_RESOURCE_LIST 设备驱动资源列表
REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串
·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL。
·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL。
·返回值同RegCreateKeyEx函数的返回值。
四、 设置键值RegSetValueEx
RegSetValueEx函数可以设置注册表中键的值,函数原型如下:
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
·参数lpValueName为一个指向包含值名的字符串指针。
·Reserved保留,通常必须设置为0。
·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数。
·参数lpData为一个指向包含数据的缓冲区的指针。
·参数cbData以字节为单位,指定数据的长度。
·返回值同RegCreateKeyEx函数的返回值。
五、 删除键值RegDeketeKey
函数RegDeketeKey删除一个键及所有的子键。函数原型如下:
LONG RegDeleteKey(
HKEY hKey,
LPCTSTR lpSubKEY
);
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。
六、 示例
下面我们在Visual C++6.0或5.0环境中新建一基于对话框的工程。设置两个命令按钮,名为“查询用户信息”和“修改用户信息”,用来查询和修改注册表中的用户姓名和公司名称。需要说明的是,用户的信息位于系统注册表中/KEY-CURRENT-USER/Software/Micrsoft/MS Setup(ACME)/User Info/的位置,键值名DefName和DefCompany分别表示用户的姓名和用户公司的名称。
1、 查询用户信息的代码
HKEY hKey; //定义有关的hKey,在查询结束时要关闭。
LPCTSTR path="Software//Micrsoft//MS Setup(ACME)//User Info//”;
LONG return0=(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,&hKey));
if(return0!=ERROR_SUCCESS)
{
MessageBox("错误:无法打开有关的键!");
Return;
}
LPBYTE username_Get=new BYTE[80];
DWORD type_1=REG_SZ;
DWORD cbData_1=80;
LONG return1=::RegQueryValueEx(hKey,"Defname:,NULL,&type_1,
username_Get,&cbData_1);
if(return1!=ERROR_SUCCESS)
{
MessageBox("错误:无法查询有关注册表信息!");
Return;
}
LPBYTE company_Get=new BYTE[80];
DWORD type_2=REG_SZ;
DWORD cbData_2=80;
LONG return2=::RegQueryValueEx(hKey,"DefCompany",NULL,&type_2,
company_Get,&cbData_2);
if(return2!=ERROR_SUCCESS)
{
MessageBox("错误:无法查询有关注册表信息!");
Return;
}
//将username_Get和company_Get转换为CString字符串,以便显示输出
CString str_username=CString(username_Get);
CString str_company=CString(company_Get);
delete[] username_Get;
delete[] company_Get;
//程序结束前关闭已经打开的hKey
::RegCloseKey(hKey);
……
字符串str_username和str_company表示查询的用户的姓名和公司的名称。
2、修改用户信息的代码
因用户输出的是CString类型的字符串,要先将其转换为LPBYTE类型,以便以后函数的调用。下面是转换函数:
LPBYTE CString_To_LPBYTE(CString str)
{
LPBYTE lpb=new BYTE [str.GetLength( )+1];
for(int i=0;i lpb[str.GetLength( )]=0;
return lpb;
}
以下是具体的修改注册表用户信息的代码:
CString str_username,str_company;
HKEY hKey;
LPCTSTR path=“Software//Micrsoft//MS Setup(ACME)//User Info//”;
LONG return0(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_WRITE,&hKey));
if(return0!=ERROR_SUCCESS)
{
MessageBox(“错误:无法打开有关的键!”);
return;
}
LPBYTE username_Set=Cstring_To_LPBYTE(str_username);
DWORD type_1=REG_SZ;
DWORD cbData_1=str_username.GetLength( )+1;
LONG return1=::RegSetalueEx(hKey,"DefName",NULL,type_1,username_Set,cbData_1);
if (return1!=ERROR_SUCCESS)
{
MessageBox(“错误:无法修改有关注册表信息!”);
return;
}
LPBYTE company_Set=Cstring_To_LPBYTE(str_company);
DWORD type_2=REG_SZ;
DWORD cbData_2=str_COMPANY.GetLength( )+1;
LONG return2=::RegSetalueEx(hKey,"DefCompany",NULL,type_2,company_Set,cbData_2);
if (return2!=ERROR_SUCCESS)
{
MessageBox(“错误:无法修改有关注册表信息!”);
return;
}
下面是一个封装类的实现源码:
#pragma once
const UINT BUFFER_LENGTH = 1024;
const UINT BUFFER_LENGTH_BINARY = 3;
enum err
{
ERR_OPENREGKEY,
ERR_SETREGVALUE,
ERR_QUERYVALUE,
ERR_DELETEVALUE,
ERR_SUBKEYEXIST,
ERR_CREATESUBKEY,
ERR_DELETESUBKEY,
ERR_SUCCESS,
ERR_KEYNOTEXIST
};
enum hkey
{
DHKEY_CLASSES_ROOT = 0x80000000,
DHKEY_CURRENT_USER = 0x80000001,
DHKEY_LOCAL_MACHINE = 0x80000002,
DHKEY_USERS = 0x80000003,
DHKEY_CURRENT_CONFIG = 0x80000005
};
class CRegeditOp
{
public:
CRegeditOp();
virtual ~CRegeditOp();
public:
//Set or modify the type and value of the key
err SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString szValue);
//query the value and the type of the key
err GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue, DWORD& strType,DWORD& length);
//delete the key value
err DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem);
//create a sub key
err AddSubKey(HKEY hMainKey, CString szSubKey);
//delete a sub key
err DeleteSubKey(HKEY hMainKey, CString szSubKey);
//check the specified key path wheather exist
err CheckRegeditFoler(HKEY hMainKey, CString szSubKey);
};
实现文件
#include "StdAfx.h"
#include "RegeditOp.h"
#include "./regeditop.h"
#include "MyFile.h"
CRegeditOp::CRegeditOp(void)
{
}
CRegeditOp::~CRegeditOp(void)
{
}
/**************************************************************************
* Name : SetStrValue
* Function: set the value of the stecial key
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which is going to be setted.
szItem:The name of the key which is going to be setted
szValue:The value of the key which is going to be setted
* Output :
* In&Out :
* Return : IF success, return ERR_SUCCESS(7);if open key failed, return ERR_OPENREGKEY(0);If set value failed, return ERR_SETREGVALUE(1)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString szValue)
{
HKEY hRsltKey;
//=========================================打开注册表
long lRslt = RegOpenKeyEx(hMainKey, szSubKey, 0,KEY_SET_VALUE,&hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return ERR_OPENREGKEY;
}
//===================================设置注册表值
lRslt = RegSetValueEx(hRsltKey,
szItem,
NULL,
REG_SZ,
LPBYTE(szValue.GetBuffer(szValue.GetLength())),
szValue.GetLength());
if (lRslt != ERROR_SUCCESS)
{
return ERR_SETREGVALUE;
}
//============================================关闭注册表键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
/**************************************************************************
* Name : GetStrValue
* Function: Query the key value and type of the specify key.
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which is going to be got.
szItem:The name of the key which is going to be got.
* Output : szValue:A string parameter that receives the value's #
strType:A DWORD parameter that receives the value's type
* In&Out : length:[IN] A DWORD parameter that spcify the value's length,if the length is smaller than the the real key length, the keyValue cann't be ruturn.
[OUT] A DWORD parameter that receives the value's length
* Return : IF success, return ERR_SUCCESS(7);if open key failed, return ERR_OPENREGKEY(0);If set value failed, return ERR_SETREGVALUE(1)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue, DWORD &strType,DWORD& length)
{
HKEY hRsltKey;
//打开注册表
if (ERROR_SUCCESS != RegOpenKeyEx(hMainKey, szSubKey,0,KEY_READ, &hRsltKey))
{
return ERR_OPENREGKEY;
}
LPBYTE lp# = new BYTE[length];
memset(lp#,0,length);
//查询注册表项值
long lRslt = RegQueryValueEx(hRsltKey, szItem, 0, &strType, lp#,&length);
szValue = (CString)lp#;
if (lRslt != ERROR_SUCCESS)
{
delete [] lp#;
return ERR_QUERYVALUE;
}
delete [] lp#;
//关闭打开的键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
/**************************************************************************
* Name : AddSubKey
* Function: Add a new key
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which is going to be created.
* Output :
* In&Out :
* Return : If success, return ERR_SUCCESS(7);if the key was exist, return ERR_SUBKEYEXIST(4);if create key failed, return ERR_CREATESUBKEY(5)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::AddSubKey(HKEY hMainKey, CString szSubKey)
{
HKEY hRsltKey;
//================================判断要增加的注册表子键是否已存在
//LONG iReturn = RegOpenKeyEx(hMainKey, szSubKey, 0,0,&hRsltKey);
if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, szSubKey,0,KEY_SET_VALUE,&hRsltKey))
{
return ERR_SUBKEYEXIST;
}
//==================================如果不存在,则增加此子键
long lRslt = RegCreateKeyEx(hMainKey, szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY ,NULL, &hRsltKey,NULL);
//long lRslt = RegCreateKey(hMainKey,szSubKey, &hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return ERR_CREATESUBKEY;
}
//===============================关闭打开的注册表键句柄
if(hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
/**************************************************************************
* Name : DeleteStrValue
* Function: Delete the value of a key
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which value is going to be deleted.
szItem:The key which to be deleted.
* Output :
* In&Out :
* Return : If success, return ERR_SUCCESS(7);if open key failed, return ERR_OPENREGKEY(0);if delete key value failed, return ERR_DELETEVALUE(3)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem)
{
HKEY hRsltKey;
//打开注册表
long lRslt = RegOpenKeyEx(hMainKey, szSubKey,0,KEY_CREATE_SUB_KEY, &hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return ERR_OPENREGKEY;
}
//删除注册表项
lRslt = RegDeleteValue(hRsltKey, szItem);
if (lRslt != ERROR_SUCCESS)
{
return ERR_DELETEVALUE;
}
return ERR_SUCCESS;
}
/**************************************************************************
* Name : DeleteSubKey
* Function: Delete a key
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which is going to be deleted.
* Output :
* In&Out :
* Return : If success, return ERR_SUCCESS(7);if delete key failed, return ERR_DELETESUBKEY(3)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::DeleteSubKey(HKEY hMainKey, CString szSubKey)
{
//=================================删除子键
long lRslt = RegDeleteKey(hMainKey, szSubKey);
if (lRslt)
{
return ERR_KEYNOTEXIST;
}
//关闭打开的键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
return ERR_SUCCESS;
}
/**************************************************************************
* Name : CheckRegeditFoler
* Function: Check wheathe the specified Key path is exist.
* Input :
hMainKey:Handle to an open key,It is returned by RegOpenKeyEx or RegCreateKeyEx.it can be one of the follows predefined keys
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
szSubKey:The path of the key which is going to be checked.
* Output :
* In&Out :
* Return : If success, return ERR_SUCCESS(7);if delete key failed, return ERR_DELETESUBKEY(3)
* Others :
* Date Version People Name Content of modify
* -----------------------------------------------------------
* 2008-8-4 V1.0 jet Create
* -----------------------------------------------------------
**************************************************************************/
err CRegeditOp::CheckRegeditFoler(HKEY hMainKey, CString szSubKey)
{
HKEY hRsltKey;
//打开注册表
if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, szSubKey,0,KEY_READ, &hRsltKey))
{
if(hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
else
{
return FALSE;
}
}