我正在尝试创建一个函数,列出一个特定(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);

asdwSize既是输入参数又是输出参数。在输入时,它说明缓冲区的大小。从RegEnumKeyEx()
指向变量的指针,该变量以字符为单位指定lpName参数指定的缓冲区大小。此大小应包括终止的空字符。如果函数成功,lpcName指向的变量包含存储在缓冲区中的字符数,不包括终止的空字符。
注意,您应该始终检查函数的返回值(就像您对RegOpenKeyEx()所做的那样)。

关于c - RegEnumKeyEx无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11802590/

10-11 01:04