Не удалось прочитать реестр win - ключ firebird с использованием delphi - PullRequest
3 голосов
/ 14 января 2012

Я не понимаю.Есть ключ реестра окна сервера firebird, который я хочу проверить, существует ли он.Ключ существует, но функция возвращает false.Что случилось?Я использую Windows 7 64x с Delphi 2010.

Tks.Дэвис.

procedure x;
  var
    reg:TRegistry;
begin

  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;

  if reg.OpenKey('\SOFTWARE\Firebird Project\Firebird Server\Instances',false)=true then
  begin
    ShowMessage('Key exists');
  end;

end;

Ответы [ 4 ]

5 голосов
/ 14 января 2012

Наиболее вероятная причина в том, что вы открыли ключ, запрашивающий доступ на запись, но в Windows 7 под UAC пользователи по умолчанию не имеют доступа на запись к HKLM. Решите это, передав KEY_READ конструктору TRegistry или используя OpenKeyReadOnly вместо OpenKey.

Следующее наиболее вероятное объяснение состоит в том, что у вас установлен 64-битный сервер Firebird. Но ваша 32-битная программа читает из 32-битного реестра и поэтому не находит ключи от 64-битного Firebird. См. Перенаправитель реестра , чтобы узнать больше о двух разных реестрах просмотров . См. Доступ к альтернативному представлению реестра для получения подробной информации о том, как прочитать 64-разрядный реестр из 32-разрядного процесса. В переводе на Delphi вам нужно будет включить KEY_WOW64_64KEY во флаги Access. Опять же, вы можете передать этот флаг конструктору TRegistry, что может быть более удобным.

Итак, в итоге, если вы ищете 32-битный сервер, создайте объект реестра следующим образом

reg := TRegistry.Create(KEY_READ);

и если ваш сервер Firebird 64-битный, используйте это

reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
2 голосов
/ 14 января 2012

Попробуйте заменить

TRegistry.Create

на

TRegistry.Create(KEY_READ)
1 голос
/ 14 января 2012

Я думаю, что поскольку вы смотрите на реестр 32-битного процесса в 64-битной операционной системе, вы действительно смотрите на "виртуальное" дерево реестра. На самом деле здесь работает скрытое «перенаправление».

См. Изменения реестра в 64-разрядных версиях Windows Server 2003 и в 64-разрядной версии Windows XP Professional в Microsoft.

32-разрядные программы и 64-разрядные программы, работающие на основе архитектуры x64 версии Windows работают в разных режимах и используют следующие разделы в реестре:

64-разрядные программы в основном режиме работают в основном режиме и имеют ключи доступа и значения, которые хранятся в следующем подразделе реестра:

HKEY_LOCAL_MACHINE\Software

32-битные программы работают в режиме WOW64 и получают доступ к ключам и значениям, которые хранится в следующем подразделе реестра:

HKEY_LOCAL_MACHINE\Software\WOW6432node

(цитата из страницы Microsoft выше)

Так что, если ваш процесс firebird установил ключи в 64-битном режиме, они не будут видны из 32-битного процесса. И вам потребуется 32-битный клиент FireBird, чтобы он работал с Delphi (если только вы не используете 64-битный режим Delphi XE2).

0 голосов
/ 21 августа 2013

Попробуйте запустить приложение от имени администратора. Я думаю, что это решит вашу проблему.

...