【问题标题】:RegOpenKey / RegOpenKeyEx returns 2 (file not found) on Windows 7, while key existsRegOpenKey / RegOpenKeyEx 在 Windows 7 上返回 2(未找到文件),而密钥存在
【发布时间】:2012-03-02 13:03:03
【问题描述】:

我试图以标准用户身份从 Windows 7 上的 HKEY_CURRENT_USER\Software\Classes 读取一个值,虽然密钥存在,但我收到错误消息。下面的两个代码都不成功:

l = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Classes", 0, KEY_READ, &hKey);

// RegOpenKeyEx doesn't success either
l = RegOpenKey(HKEY_CURRENT_USER, L"Software\\Classes", &hKey);

此代码位于一个 dll 中,由一个应用程序调用,该应用程序执行许多操作(我不知道它的全部功能)。

但是,RegOpenKey同一台计算机同一帐户 上的简单应用程序完美运行...

谁能告诉我可能导致问题的原因以及两者之间的区别? 测试应用程序是用 c++ 编写的,而 dll 是用 c 编写的。

编辑:问题已解决,只需删除 L“Software\Classes”之前的“L”...

【问题讨论】:

  • 您的操作系统是 32 位还是 64 位?
  • @João Augusto:问题是“返回 2(未找到文件)”
  • 那么既然你说你的操作系统是 32 位的,那么只有 1 个选项,调用 dll 的应用程序正在另一个用户下运行。
  • 或冒充其他用户。
  • 我敢打赌,这个问题完全是另外一回事。例如,您可能在调用RegOpenKey 之后调用GetLastError,而没有先检查RegOpenKey 的返回值。

标签: c++ c registry registrykey


【解决方案1】:

很可能,代码正在以其他用户身份运行,或者其当前用户与进程的缓存注册表项不同步。见RegOpenCurrentUser

【讨论】:

    【解决方案2】:

    我通过将“Software\Classes”而不是 L“Software\Classes”传递给函数解决了这个问题。

    【讨论】:

    • 这毫无意义。你不能通过char*wchar_t*。这是一个或另一个。你是否使用了正确的头文件?!
    • 好吧,我不是 C/C++ 开发人员,我什至不知道“L”是什么意思。代码取自一个用 C++ 编写的程序,它运行良好,但在用 C 编写的 Dll 中,我必须删除“L”才能让它工作......
    • 我现在这样调用我的函数: OverrideClassesRoot(HKEY_CURRENT_USER, "Software\\Classes");这是它的原型: OverrideClassesRoot(HKEY hKeyBase, LPCWSTR szOverrideKey) 我这样在函数中调用 RegOpenKey: RegOpenKey(hKeyBase, szOverrideKey, &hKey)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2012-06-23
    • 1970-01-01
    • 2019-02-05
    • 2018-04-10
    • 1970-01-01
    相关资源
    最近更新 更多