【问题标题】:RegOpenKeyEx fails on HKEY_LOCAL_MACHINERegOpenKeyEx 在 HKEY_LOCAL_MACHINE 上失败
【发布时间】:2010-10-23 16:18:42
【问题描述】:

您好,我正在尝试读取一个注册表值,它为我提供了 firefox.exe 的路径。 这是存储在

HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 3.0.10\bin

(版本号可以在别处找到)

但我似乎无法让 RegOpenKeyEx 为以下任何内容返回 ERROR_SUCCESS

HKEY_LOCAL_MACHINE

所以这个测试失败了:

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("\\SOFTWARE"),0,KEY_QUERY_VALUE,&keyHandle) == ERROR_SUCCESS)

当此测试通过时:

if(RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT("\\Shell"),0,KEY_QUERY_VALUE,&keyHandle) == ERROR_SUCCESS)

【问题讨论】:

  • RegOpenKeyEx 失败后GetLastError() 的值是多少?
  • 不要检查GetLastError(),这个函数没有设置。错误代码在返回值中,所以将它分配给一个变量。

标签: c++ winapi registry


【解决方案1】:

以下代码在我的机器上失败,错误代码为 161,表示“路径错误”(在 winerror.h 中查找):

long n = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE"),
                      0,KEY_QUERY_VALUE, &hk );

然后我更改了对 RegOpenKeyEx 的调用以使用“SOFTWARE”(注意没有前导斜杠)并且它起作用了:

#include <windows.h>
#include <iostream>
using namespace std; 

int main() {
    HKEY hk;

    // Notice that it's SOFTWARE instead of \\SOFTWARE:
    long n = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE"),
                      0,KEY_QUERY_VALUE, &hk );
    if ( n == ERROR_SUCCESS ) {
        cout << "OK" << endl;
    }
    else {
        cout << "Failed with value " << n << endl;
    }
}

【讨论】:

  • 谢谢,就是这样!我认为这可能是因为 SOFTWARE 保存在一个单独的文件中(虽然从维基百科获得了这个信息),而不是像 Shell 这样的文件夹在 HKEY_CLASSES_ROOT
  • 如何处理hk 才能真正阅读它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2014-05-25
  • 2012-11-28
  • 1970-01-01
  • 2012-06-23
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多