注册表的操作,
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
删除注册表键及其所有的子键。
删除例子
HKEY hKey;
LONG lRes;
lRes= RegOpenKeyEx(HKEY_LOCAL_MACHINE,m_szAU,0,KEY_WRITE,&hKey);
if( lRes != ERROR_SUCCESS )
{
}else{
RegDeleteValue(hKey,m_szAUOptions);
RegCloseKey(hKey);
gLogger.debug("[ApplyWorker]Del Key AUOptions");
}
本文详细介绍Windows注册表操作API,涵盖25个核心函数,包括读取、写入、删除等功能,以及如何正确使用这些函数避免系统问题。
1365

被折叠的 条评论
为什么被折叠?



