我正在尝试使用一些16位和32位注册表函数,而我在使用RegQueryValue(未扩展)时遇到问题。我正在打开HKLM \ Software \ Microsoft \ EventSystem的句柄(这个密钥是随机选择的,问题在密钥上是持久的)。当我为“已配置”调用RegQueryValue时,出现错误。但是,对于RegQueryValueEx,我实际上能够获得该值。
我在Windows 7 x64上运行此功能,使用管理员权限进行测试(没有管理员权限意味着RegOpenKeyEx失败并且权限不足)。
以下是代码(请参阅https://stackoverflow.com/questions/455434/how-should-i-use-formatmessage-properly-in-c for 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转换为字符串,但这对我遇到的问题并不重要。)
答案 0 :(得分:3)
当您致电RegQueryValue(hkey, "Configured")
时,会尝试读取名为“键的默认值(或未命名值)配置”。这是MSDN所描述的RegQueryValue()的语义。
因此,RegQueryValue()不能用于读取“已配置”之类的命名值,因此如果要读取命名值,则必须使用RegQueryValueEx()。
答案 1 :(得分:1)
您正在查询某个值,但RegQueryValue()
的字符串参数是子键。请参阅msdn了解RegQueryValue()
与RegQueryValueEx()
。