Проблемы с чтением реестра из Delphi 7 на 64-битной Windows 7 - PullRequest
3 голосов
/ 19 мая 2010

Я думаю, что этот вопрос уже задавался, но я не мог найти решение, которое работает для меня. Я использую Delphi 7 под Windows 7 Ultimate, 64 бит. На самом деле я начал писать приложение под 32-битной ОС, но затем сменил ПК, теперь его 64. В моей программе я использую процесс регистрации с идентификатором лицензии, сгенерированным из значения PROGID в Windows. К сожалению, он не читает значение, похоже, что он ищет в другой папке, вероятно, перенаправлен Windows 64 в 32-битный реестр. Вы можете помочь? Это код, который я использую:

 Registry := TRegistry.Create(KEY_READ OR $0100);
    try
      Registry.Lazywrite := false;
      Registry.RootKey := HKEY_LOCAL_MACHINE;
      if CheckForWinNT = true then
       Begin
       if not Registry.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion') then showmessagE('cant open');
       end
      else
        Registry.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion');
      result := Registry.ReadString('ProductID'); 
      Registry.CloseKey;
    finally
      Registry.Free;
    end; // try..finally

Кроме того, знаете ли вы, как определить, работает ли программа под 64-битным или 32-битным компьютером в Delphi 7?

Ответы [ 4 ]

12 голосов
/ 19 мая 2010

Вы уже задавали этот вопрос, см. В Windows 7 в Delphi 7 .

не работает метод ReadString реестра.

Итак, вы знаете, что вы должны добавить $ 0100 в TRegistry.Create. Проблема с вашим кодом заключается в том, что вы используете OpenKeyReadOnly, который сбрасывает свойство Access реестра в KEY_READ, поэтому KEY_READ or $0100 теряется.

Просто используйте OpenKey вместо OpenKeyReadOnly, это не сбросит ваше свойство Access.

9 голосов
/ 19 мая 2010

Вот некоторый код Delphi 7, чтобы определить, работаете ли вы в 64-битной ОС:

function Is64BitOS: Boolean;
type
  TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
  hKernel32 : Integer;
  IsWow64Process : TIsWow64Process;
  IsWow64 : BOOL;
begin
  // we can check if the operating system is 64-bit by checking whether
  // we are running under Wow64 (we are 32-bit code). We must check if this
  // function is implemented before we call it, because some older versions
  // of kernel32.dll (eg. Windows 2000) don't know about it.
  // see http://msdn.microsoft.com/en-us/library/ms684139%28VS.85%29.aspx
  Result := False;
  hKernel32 := LoadLibrary('kernel32.dll');
  if (hKernel32 = 0) then RaiseLastOSError;
  @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
  if Assigned(IsWow64Process) then begin
    IsWow64 := False;
    if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin
      Result := IsWow64;
    end
    else RaiseLastOSError;
  end;
  FreeLibrary(hKernel32);
end;

(бесстыдно плагиат от меня, здесь )

Похоже, вы передаете KEY_WOW64_64KEY ($ 0100), поэтому вы должны обратить внимание на 64-битную ветку реестра.Если вы хотите взглянуть на 32-битную ветку реестра, вы должны передать KEY_WOW64_32KEY ($ 0200).

1 голос
/ 05 сентября 2011

Я знаю, что эта тема посвящена Delphi 7, но я подумал, что у меня проблемы с чтением реестра, и пришел сюда, чтобы узнать ... В итоге я использовал Key_Read вместо всех дополнительных функций, предложенных здесь.

Я использую Delphi 2010, и я использовал Key_Read очень хорошо.

Вот моя часть моего источника, которая работает:

//Search registry

reg:=TRegistry.Create(KEY_READ);

  with reg do begin

    try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then
        begin
          memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists');
          wowdir1 := readstring('InstallPath');
          memo.Lines.Add('InstallPath - ' + wowdir1);
          newline;
          closekey;
        end;
      if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then
        begin
          memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists');
          wowdir2 := readstring('GamePath');
          memo.Lines.Add('GamePath - ' + wowdir2);
          newline;
          wowdir1 := readstring('');
          closekey;
        end;
      if OpenKey('\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft',false) then
         begin
          memo.Lines.Add'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft - exists');
          wowdir3 := readstring('InstallLocation');
          memo.Lines.Add('InstallLocation - ' + wowdir3);
          newline;
          wowdir1 := readstring('');
          closekey;
        end;
    finally
     reg.Free;
    end;

Я попробовал другие ключи, которые отображаются здесь, и обнаружил, что мне не нужно KEY_WOW64_64KEY ИЛИ KEY_WOW64_32KEY. Это, должно быть, ошибка, которая была исправлена ​​в Delphi 2010.

1 голос
/ 19 мая 2010

Что касается вашего дополнительного вопроса, будь то 64-битный компьютер (что не то же самое, что работает на 64-битной ОС), взгляните на ответы на этот вопрос .

...