Реестр Visual Studio C ++ RegOpenKeyEx () Доступ запрещен ошибка Windows 7 64 бит - PullRequest
0 голосов
/ 16 октября 2011

Я запускаю программу C ++ (которая отлично работает на 32-битной Win XP) в 64-битной Windows 7 в отладчике под Visual Studio 2010, и я не могу открыть существующий раздел реестра с помощью следующего кода:

#define ACCESS  (KEY_WRITE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS)

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_64KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

Код ошибки: 5 с системным сообщением «Доступ запрещен».

Это работает, если я запускаю Visual Studio 2010 в качестве администратора, однако я бы предпочел этого не делать. Кто-нибудь может предложить предложение?

Обновление: я забыл упомянуть, что я делаю здесь портирование устаревшего кода из Windows XP. Таким образом, у меня нет возможности изменить фундаментальную структуру написания этого программного обеспечения. Поскольку унаследованный код использует реестр, именно это должен делать и перенесенный код.

Кроме того, я бы предпочел не вносить изменения в мой конкретный компьютер - поскольку это означает, что мне придется менять каждый компьютер, на котором я хочу запустить это. Это может привести к путанице, поскольку затронуто много машин. Например, я не хочу отключать UAC для всей машины.

Дальнейшее обновление: я не нашел решения, которым я доволен. Решили игнорировать код ошибки 5 для целей отладки, и на данный момент кажется, что он работает достаточно хорошо. Я пытаюсь понять, как стандартные приложения, такие как Word, Firefox и т. Д., По-видимому, используют реестр для всех видов настроек, но при этом не повышены, и при этом мне не нужно давать им специальные разрешения для внесения изменений в реестр?

Ответы [ 3 ]

4 голосов
/ 16 октября 2011

Хорошо, я нашел ответ на свой вопрос, поэтому я опубликую его здесь на случай, если кому-то еще понадобится его для дальнейшего использования. Этот поток оказался полезным, хотя на самом деле он относится к теме C #:

http://social.msdn.microsoft.com/Forums/da-DK/netfx64bit/thread/92f962d6-7f5e-4e62-ac0a-b8b0c9f552a3

По сути, мне нужно было изменить разрешение на чтение 32-битного реестра вместо 64-битного, например:

HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_32KEY, &hKey);

if (dwErrorCode != ERROR_SUCCESS) 
{
// display error message
}

Вуаля, теперь все работает! Всем спасибо за ваши усилия.

Обновление: выясняется, что это не сработало на моей другой машине, что привело меня к обнаружению того, что кто-то должен был изменить права доступа к 32-битному реестру на одной из моих машин. Поэтому по-прежнему необходимо предоставить пользователю права доступа к разделу реестра, с которым вы хотите работать.

2 голосов
/ 16 октября 2011

Вам нужно запустить процесс в режиме повышенных прав или отключить UAC.Конечно, вы можете назначить права доступа для вашего конкретного раздела реестра, который позволяет вам получить доступ.

0 голосов
/ 02 апреля 2018

Я столкнулся с той же проблемой.Я решил, используя следующее:

LPCTSTR subKey = TEXT("Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\App Paths");
LONG openRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_WOW64_32KEY && KEY_ALL_ACCESS, &hKey);
...