как создать ключ в HKLM с помощью TRegistry - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь создать ключ в HKLM, но он создается в HKLM \ SOFTWARE \ Wow6432Node! C ++ Builder 2010 создает 32-разрядную версию и сохраняет в разделе приложения 32
работает windows 7 x64

Как использовать TRegistry, чтобы сделать это, используя флаги или ....

кроме того OpenKeyEx там нет: (

вот мой код

TRegistry * reg=new TRegistry(KEY_WRITE);
try 
{
  reg->RootKey=HKEY_LOCAL_MACHINE;
  if (!reg->OpenKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\SpecialAccounts\\UserList",0)) 
  {
    //reg->CreateKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\SpecialAccounts\\UserList");
  }
  //reg->Access=KEY_WRITE;
  bool ores=reg->OpenKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\SpecialAccounts\\UserList",true);
  reg->WriteString("ouser","0");
  reg->CloseKey();
} 
catch (...) 
{
  delete reg;
}

1 Ответ

4 голосов
/ 29 февраля 2012

Вы пытаетесь получить доступ к 64-битному ключу реестра из 32-битного процесса.Чтобы сделать это, вам нужно включить флаг KEY_WOW64_64KEY при открытии ключа, например:

TRegistry *reg = new TRegistry(KEY_WRITE | KEY_WOW64_64KEY);

Или:

reg->Access = KEY_WRITE | KEY_WOW64_64KEY;

В будущем, если вы когда-либо обновитев XE2 или новее, которые поддерживают 64-битную разработку, тогда вы должны указывать флаг, только если IsWow64Process() сообщает, что вы 32-битный процесс, работающий под WOW64, например:

BOOL bIsWow64 = FALSE;
IsWow64Process(GetCurrentProcess(), &bIsWow64);

long flags = KEY_WRITE;
if (bIsWow64) flags |= KEY_WOW64_64KEY;

.

TRegistry *reg = new TRegistry(flags);

.

reg->Access = flags;
...