qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::


注册表简介:
注册表是Windows程序员建造的一个复杂的信息数据库,它是多层次式的。在不同系统上注册表的基本结构相同。其中的复杂数据会在不同方式上结合,从而产生出一个绝对唯一的注册表。

注册表结构:
注册表由键(或称“项”)、子键(子项)和值项构成。一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

注册表中的数据类型:
显示类型(在编辑器中)    数据类型            说明
REG_SZ         字符串    文本字符串
REG_MULTI_SZ      多字符串     含有多个文本值的字符串
REG_BINARY       二进制数      二进制值,以十六进制显示。
REG_DWORD         双字   一个32位的二进制值,显示为8位的十六进制值

VC中使用需要添加头文件:
#include
#pragma comment (lib, "advapi32.lib")

注册表操作
1. RegClose()
原形:LONG RegCloseKey(
  HKEY hKey // 释放已经打开的注册表句柄
 );
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:关闭指定的主册表键,释放句柄当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果。关闭一个键后,句柄变为非法,以使其不可再次被使用。为系统重新使用而释放句柄。
例子:if( bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS ) ) m_hKey = NULL;


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 //用来查看是打开一个已经有的键,还是新建了键
 );
原型:LONG RegCreateKey(
  HKEY hKey,     // 主键名称
  LPCTSTR lpSubKey,   // 子键名称或路径
  PHKEY phkResult,   // 指向你建的句柄
 );
返回值:不成功返回非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  // 数据长度
 );
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:读取某子键下特定名称的值。
例子
CString m_strQ;//用来存放查询来的字符串值
DWORD m_dwCount;//记录字符串的长度(包括NULL字符)
::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&m_dwCount);//先查询出字节空间
ret1=(::RegQueryValueEx(m_hkey,"",0,NULL,(unsigned char*)m_strQ.GetBuffer(m_dwCount),&m_dwCount));
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,    // 打开的句柄
  LPCTSTR lpSubKey,  // 子健的路径
  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
解释:连接到远程系统的注册表。

posted on 2012-12-26 12:11  qintangtao  阅读(507)  评论(0编辑  收藏  举报