【问题标题】:RegOpenKeyEx return ERROR_SUCCESS but it shouldn't (windows 7)RegOpenKeyEx 返回 ERROR_SUCCESS 但它不应该(Windows 7)
【发布时间】:2011-03-06 00:06:25
【问题描述】:

我有一个关于 RegOpenKeyEx 的问题,代码:

#include <tchar.h>
#include <stdio.h>
#include <windows.h>

#pragma comment (lib, "Advapi32.lib")


int main () {
    TCHAR *keyName = _T("SOFTWARE\\foobar2000\\capabilities");
    HKEY key = NULL;
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) {
        printf("open key failed!\n");
        return -1;
    } else {
            printf("open key success!\n");
    }

    TCHAR *value = _T("123");
    if (RegSetValueEx(key, _T("xxx"), 0, REG_SZ,
            (const BYTE *)value, sizeof(TCHAR) * (_tcslen(value) + 1)) != ERROR_SUCCESS) {
        printf("set value failed!\n");
    }
    RegCloseKey(key);
    return 0;
}

将代码保存在reg.cpp中,并在命令模式下:

cl reg.cpp

我得到了 reg.exe,运行它:

D:\tmp>reg.exe

开关键成功!

但该值尚未写入注册表。

另外一个奇怪的是,如果我使用visual studio创建一个CLI项目,并将代码粘贴到main()中,RegOpenKeyEx()会返回false。

平台为windows 7,开启UAC。

【问题讨论】:

    标签: c++ winapi windows-7 registry uac


    【解决方案1】:

    听起来您正在使用虚拟化。如果应用程序没有清单,当您尝试写入 HKLM\Software 时,它​​实际上会写入HKEY_USERS\&lt;User SID&gt;_Classes\VirtualStore\Machine\Software。为防止这种情况,您可以运行提升的应用程序。您可能想要添加一个清单,强制它每次都运行提升。或者,停止写入 HKLM 并改用 HKCU。

    至于 C++/CLI 部分,我猜你会得到一个 asInvoker 清单,这会抑制虚拟化并导致尝试访问 HKLM 失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2015-02-21
      • 1970-01-01
      • 2013-08-22
      • 2012-01-22
      • 1970-01-01
      相关资源
      最近更新 更多