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

5

我遇到了一个关于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已启用。

1个回答

5
听起来你遇到了虚拟化的问题。如果应用程序没有清单文件,在尝试写入HKLM\Software时,实际上会写入HKEY_USERS\_Classes\VirtualStore\Machine\Software。为了防止这种情况发生,你可以以提升的权限运行应用程序。你可能需要添加一个强制每次都以提升权限运行的清单文件。或者,停止写入HKLM并改用HKCU。

至于C++/CLI部分,我猜测你得到了asInvoker清单文件,这会抑制虚拟化,在尝试访问HKLM时导致失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接