0

我正在尝试创建一个列出特定(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;
}
4

2 回答 2

3

在调用 to 之前添加以下行RegEnumKeyEx()

dwSize = sizeof(dwValue);

asdwSize是输入和输出参数。在输入时,它说明缓冲区的大小。来自RegEnumKeyEx()

指向变量的指针,该变量指定由 lpName 参数指定的缓冲区大小(以字符为单位)。此大小应包括终止空字符。如果函数成功,lpcName 指向的变量包含存储在缓冲区中的字符数,不包括终止空字符。

请注意,您应该始终检查函数的返回值(就像您为 所做的那样RegOpenKeyEx())。

于 2012-08-03T20:17:00.927 回答
1

如果您检查 RegEnumKeyEx 调用的返回代码,您会看到您得到 0xEA,这意味着数据比您提供的缓冲区长。

这是因为 dwSize 是一个输入/输出参数。当您调用它时,该函数假定缓冲区最后有 dwSize 个字符可用。返回时,dwSize 已更改为实际数据的大小。这使得 dwSize 比实际缓冲区大小小得多。在下一次调用时,它可能认为您没有足够的空间,而是返回错误代码。

您需要在每次调用之前重置 dwSize。

于 2012-08-03T20:17:38.177 回答