我正在尝试使用一些16位和32位注册表函数,但在使用RegQueryValue(未扩展)时遇到问题。我正在打开HKLM\Software\Microsoft\EventSystem的句柄(此密钥是随机选择的,问题在密钥之间持续存在)。当我为“Configured”调用RegQueryValue时,有一个错误。但是,对于regqueryvaluex,我实际上能够获得值。
我在Windows 7 x64上运行这个程序,用管理员权限测试(没有管理员权限意味着RegOpenKeyEx失败,权限不足)。
下面是代码(请参见https://stackoverflow.com/questions/455434/how-should-i-use-formatmessage-properly-in-c以获取printErrorMessage):

#define BUFLEN 80
int main() {
    HKEY hkey;
    DWORD ret = RegOpenKeyA(rootKey, "Software\\Microsoft\\EventSystem", &hkey);
    printf("Opened key, handle is %i\n", hkey);
    LONG buflen = BUFLEN;
    DWORD dwbuflen = BUFLEN;
    char data[BUFLEN];
    BYTE bdata[BUFLEN];
    ret = RegQueryValueA(hkey, "Configured", data, &buflen);
    if (ret != ERROR_SUCCESS) {
        printf("Unable to open Configured with RegQueryValueA\n");
        printErrorMessage(ret);
    } else {
        printf("Value of Configured was %s\n", data);
    }
    ret = RegQueryValueExA(hkey, "Configured", 0, NULL, bdata, &dwbuflen);
    if (ret != ERROR_SUCCESS) {
        printf("Unable to open Configured with RegQueryValueExA\n");
        printErrorMessage(ret);
    } else {
        printf("Value of Configured was %s\n", bdata);
    }
}

这里是输出:
Opened key, handle is 68
Unable to open Configured with RegQueryValueA
The system cannot find the file specified.
Value of Configured was ☺

(Configured的值是不可靠的,因为我还没有费心将REG_DWORD转换为字符串,但这对我遇到的问题来说并不重要)。

最佳答案

调用RegQueryValue(hkey, "Configured")时,它尝试读取名为“Configured”的键的默认值(或未命名值)。这是MSDN所描述的RegQueryValue()的语义。
因此RegQueryValue()不能用于读取“Configured”之类的命名值,因此如果要读取命名值,必须使用RegQueryValueEx()。

关于c - RegQueryValue失败,但是RegQueryValueEx返回一个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21418968/

10-09 22:44