LONG WINAPI RegOpenKeyEx(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey,
__reserved DWORD ulOptions,
__in REGSAM samDesired,
__out PHKEY phkResult
);
这个函数用来打开一个注册表键的句柄,用于之后获取注册表键的值
hKey 是一个输入参数,指定了需要打开的注册表父键句柄,可以用预定义的宏,其中 HKEY_LOCAL_MACHINE 的值是 -2147483646
lpSubKey 是一个字符串,指定了子键的值
ulOptions 是系统保留参数,必须传递 0
samDesired 是你想要有的针对打开的注册表键的权限,如果该注册表键的安全描述符不允许调用进程(RM)拥有这样的权限则函数失败
phkResult 是输出参数,接收打开的子键句柄
LONG WINAPI RegQueryValueEx(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
这个函数可以用来获取某个注册表键所对应的值
hKey 指定该注册表键的句柄
lpValueName 指定值的名称(因为注册表是一个多重映射)
lpReserved 是系统保留参数,必须传递 0
lpType 接收该值的类型,如果不需要则传递 NULL
lpData 接收值,如果不需要则传递 NULL
lpcbData 指定了 lpData 缓冲区大小
LONG WINAPI RegCloseKey(
__in HKEY hKey
);
关闭注册表键句柄,释放资源
hKey 是之前通过 RegOpenKeyEx 获取的键句柄
读取 RTP 路径:
其中 Wow6432Node 是 64 位 Windows 才会有的一个节点,32 位的 Enterbrain 直接在 SOFTWARE 键下
//===============================================================================
Win32 API提供了大约25个有关注册表的函数,他提供了对注册表的读取,写入,删除,以及打开注册表的所有函数,并且可以实现对注册表备份,连接和对远端注册表进行查看等功能。但是在编程的时候首先需要考虑你是在什么操作系统编辑此类程序,虽然微软的操作系统,如NT和Windows98都是32位操作系统,但是有些API函数中并不支持98,这点是要注意的。API经历和发展了很多年,有些函数已经重复,比如RegSetValue()及RegSetValueEx()都是用来设置注册表键值的,两者的区别在于前者是设置注册表键的默认值,仅支持作为数据类型的字符串,而后者不仅继承了前者的所有功能而且还能对多值或类型进行操作。一般API对比较新的函数都会在后缀追加"Ex"的同样名称函数,建议在编程中均应尽可能的使用高级函数。下面介绍一些比较常用的操作注册表的API函数:
1、RegCloseKey()
原型:RegCloseKey(HKEY hKey)
解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。
2、RegCreateKeyEx()
原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition );
解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。各参数及返回值的含义如下:
各参数及返回值的含义如下:
·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()函数来获取一个对错误的总体描述。
3、RegOpenKeyEx()
原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult );
解释:打开一个指定的键,并返回打开键的句柄。
各参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;
·参数ulOption保留,通常必须设置为0;
·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;
·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄;
·函数的返回值同RegCreateKeyEx函数的返回值。
4、 查询某一个键值:RegQueryValueEx()
原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, 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函数的返回值;
5、RegSetValueEx()
原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType,
const BYTE *lpData, DWORD cbData);
解释:设置注册表中的一个键值。
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;
·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;
·参数lpData为一个指向包含数据的缓冲区的指针;
·参数cbData以字节为单位,指定数据的长度;
返回值同RegCreateKeyEx函数的返回值。
6、RegDeketeKey()
原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);
解释:函数RegDeketeKey删除一个键及所有的子键。
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。