簡體   English   中英

RegEnumKeyEx無法正常工作

[英]RegEnumKeyEx doesn't work properly

我正在嘗試制作一個列出特定(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()的調用之前, RegEnumKeyEx()下行添加到:

dwSize = sizeof(dwValue);

因為dwSize既是輸入參數,也是輸出參數。 輸入時,它說明緩沖區的大小。 RegEnumKeyEx()

指向變量的指針,該變量以字符為單位指定lpName參數指定的緩沖區的大小。 此大小應包括終止的空字符。 如果函數成功執行,則lpcName指向的變量將包含緩沖區中存儲的字符數,不包括終止的空字符。

注意,您應該始終檢查函數的返回值 (就像對RegOpenKeyEx()所做的那樣)。

如果檢查RegEnumKeyEx調用的返回碼,您會看到得到0xEA,這意味着數據比提供的緩沖區長。

這是因為dwSize是輸入/輸出參數。 當您調用它時,該函數假定緩沖區最后有可用的dwSize字符。 返回時,dwSize已更改為實際數據的大小。 這使dwSize遠遠小於實際的緩沖區大小。 在下一次調用時,它可能認為您沒有足夠的空間,而是返回錯誤代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM