RegOpenKeyEx返回ERROR_SUCCESS但它不应该返回(Windows 7)

时间:2010-06-20 14:14:26

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

我有一个关于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&GT; REG.EXE

打开关键成功!

但该值尚未写入注册表中。

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

平台是Windows 7,启用了UAC。

1 个答案:

答案 0 :(得分:5)

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

对于C ++ / CLI部分,我的猜测是你会得到一个asInvoker清单,它会抑制虚拟化并导致试图让HKLM失败。