как создать ключ в HKLM с помощью TRegistry

Я пытаюсь создать ключ в 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;
}

person Suhrob Samiev    schedule 29.02.2012    source источник


Ответы (1)


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

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

Or:

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;
person Remy Lebeau    schedule 29.02.2012