1.RegEnumKeyEx函数,下面是它声明:
lpcName
这个参数比较有意思,它先要求使用者提供缓冲区的长度,NULL字符也要计算进去。然后函数返回时,lpcName就表示键名的实际长度,但是不包括NULL字符。
要是传入的长度比实际的长度要小会怎么样?
那样就取不到键名,函数返回值就会是ERROR_MORE_DATA。同时lpcName不会改变,你原来传进去是多少还是多少,函数不会把实际需要的长度告诉你。
LONG RegEnumKeyEx(
HKEY hKey, // handle to key to enumerate
DWORD dwIndex, // subkey index
LPTSTR lpName, // subkey name
LPDWORD lpcName, // size of subkey buffer
LPDWORD lpReserved, // reserved
LPTSTR lpClass, // class string buffer
LPDWORD lpcClass, // size of class string buffer
PFILETIME lpftLastWriteTime // last write time
);
要注意的地方是lpcName这个参数,看一下MSDN的说明
lpcName
[in/out] Pointer to a variable that specifies the size, in TCHARs, of the buffer specified by the lpName parameter. This size should include the terminating null character. When the function returns, the variable pointed to by lpcName contains the number of characters stored in the buffer. The count returned does not include the terminating null character.
这个参数比较有意思,它先要求使用者提供缓冲区的长度,NULL字符也要计算进去。然后函数返回时,lpcName就表示键名的实际长度,但是不包括NULL字符。
要是传入的长度比实际的长度要小会怎么样?
那样就取不到键名,函数返回值就会是ERROR_MORE_DATA。同时lpcName不会改变,你原来传进去是多少还是多少,函数不会把实际需要的长度告诉你。
但是MSDN对于返回值这里是怎么描述的?
If a key has been successfully retrieved and there are more keys to be retrieved, the function returns ERROR_MORE_DATA.
我原来的理解是如果还有键值可以遍历就会返回ERROR_MORE_DATA。虽然我的理解不太准确(根本就不对嘛),但是我从原文怎么也看不出“如果缓冲区长度不够,就返回ERROR_MORE_DATA”的意思。
LONG RegQueryValueEx(
HKEY hKey, // handle to key
LPCTSTR lpValueName, // value name
LPDWORD lpReserved, // reserved
LPDWORD lpType, // type buffer
LPBYTE lpData, // data buffer
LPDWORD lpcbData // size of data buffer
);
这个函数可以获取指定键的键值。但是hKey必须先使用
RegCreateKeyEx 或者
RegOpenKeyEx 函数在KEY_QUERY_VALUE权限下打开。在这里使用预定义键毫无用处,比如这样
RegQueryValueEx(HKEY_CLASSES_ROOT,…..);
执行不会成功,只会返回一个ERROR_FILE_NOT_FOUND的错误值。
3.返回值
基本上所有的RegXXX函数的返回值都是System Error Code,成功时返回0,表示ERROR_SUCCESS,失败时返回各种错误代码。这表示在函数执行失败的时候,可以不用GetLastError函数查找错误代码。事实上在这里执行GetLastError毫无用处,它始终都会返回0。