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

への呼び出しの前に、次の行を に追加しますRegEnumKeyEx()

dwSize = sizeof(dwValue);

dwSize入力パラメータと出力パラメータの両方です。入力では、バッファのサイズを示します。からRegEnumKeyEx():

lpName パラメーターで指定されたバッファーのサイズを文字数で指定する変数へのポインター。このサイズには、終端のヌル文字を含める必要があります。関数が成功した場合、lpcName が指す変数には、バッファーに格納されている文字数 (終端の null 文字は含まれません) が含まれます。

関数からの戻り値を常にチェックする必要があることに注意してください( で行ったようにRegOpenKeyEx())。

于 2012-08-03T20:17:00.927 に答える
1

RegEnumKeyEx 呼び出しからのリターン コードを確認すると、0xEA を取得していることがわかります。これは、データが指定したバッファーよりも長いことを意味します。

これは、dwSize が入出力パラメータであるためです。関数を呼び出すと、関数は、バッファーに dwSize 文字が使用可能であると想定します。戻ると、dwSize は実際のデータのサイズに変更されています。これにより、dwSize は実際のバッファー サイズよりもはるかに小さくなります。次の呼び出しでは、十分なスペースがないと判断され、代わりにエラー コードが返されます。

各呼び出しの前に dwSize をリセットする必要があります。

于 2012-08-03T20:17:38.177 に答える