У меня есть проблема о 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, и в командном режиме:
статья reg.cpp
и я получил reg.exe, выполните его:
D:\tmp>reg.exe
откройте ключевой успех!
Но значение не было записано в реестре.
Другая странная вещь состоит в том, что, если я использую Visual Studio для создания проекта CLI, и вставляют код в основной (), RegOpenKeyEx () возвратит false.
Платформа является окнами 7, и контроль учётных записей включен.
Похоже, вы столкнулись с виртуализацией. ЕСЛИ приложение не имеет манифеста, при попытке записи в HKLM \ Software оно фактически записывает в HKEY_USERS \
. Чтобы предотвратить это, вы можете запустить приложение с повышенными правами. Возможно, вы захотите добавить манифест, заставляющий его каждый раз запускаться с повышенными правами. В качестве альтернативы прекратите запись в HKLM и используйте вместо этого HKCU.
Что касается части C ++ / CLI, я предполагаю, что вам будет предоставлен манифест asInvoker для этой части, который подавляет виртуализацию и приводит к сбою попытки добраться до HKLM.