RegOpenKeyEx возвращает ERROR_SUCCESS, но это не должно (Windows 7) - PullRequest
5 голосов
/ 20 июня 2010

У меня проблема с 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 и в командном режиме:

кл рег.cpp

и я получил reg.exe, запустите его:

D: \ TMP> reg.exe

открытый ключ успеха!

Но значение не было записано в реестре.

Еще одна странная вещь: если я использую Visual Studio для создания проекта CLI и вставлю код в main (), RegOpenKeyEx () вернет false.

Платформа - Windows 7, и UAC включен.

1 Ответ

5 голосов
/ 20 июня 2010

Похоже, вы работаете в виртуализации. Если приложение не имеет манифеста, при попытке записи в HKLM \ Software оно фактически записывает в HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software. Чтобы предотвратить это, вы можете запустить приложение с повышенными правами. Возможно, вы захотите добавить манифест, заставляющий его запускаться с повышенными правами каждый раз. Или прекратите запись в HKLM и используйте вместо этого HKCU.

Что касается части C ++ / CLI, я думаю, вы получили манифест asInvoker для этого, который подавляет виртуализацию и приводит к неудачной попытке попасть в HKLM.

...