我正在尝试创建一个函数,列出一个特定(windows注册表)项的所有子项。
发生的情况是只有第一个项被正确输出,所有其他项都被截断或重复-我认为这是一个缓冲区问题。
我已经读过函数文档,但它对我没有多大帮助。
代码如下:
#include<stdio.h>
#include<windows.h>
void print_list(HKEY hkey, char* path){
char dwValue[255];
DWORD dwSize = 0;
DWORD n; // subkeys
HKEY tmp;
int i;
if(RegOpenKeyEx(hkey, path, 0, KEY_READ, &tmp) == ERROR_SUCCESS){
DWORD dwSize = sizeof(dwValue);
RegQueryInfoKey(tmp,NULL,NULL,NULL,&n,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
for(i=0; i< n; i++){
RegEnumKeyEx(tmp,i,dwValue,&dwSize,NULL,NULL,NULL,NULL);
printf("%s\n", dwValue);
}
RegCloseKey(tmp);
}
}
int main(){
print_list(HKEY_LOCAL_MACHINE, "SOFTWARE");
return 0;
}
最佳答案
在调用RegEnumKeyEx()
之前添加以下行:
dwSize = sizeof(dwValue);
as
dwSize
既是输入参数又是输出参数。在输入时,它说明缓冲区的大小。从RegEnumKeyEx()
:指向变量的指针,该变量以字符为单位指定lpName参数指定的缓冲区大小。此大小应包括终止的空字符。如果函数成功,lpcName指向的变量包含存储在缓冲区中的字符数,不包括终止的空字符。
注意,您应该始终检查函数的返回值(就像您对
RegOpenKeyEx()
所做的那样)。关于c - RegEnumKeyEx无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11802590/