Реестр метод ReadString не работает в Windows 7 в Delphi 7

Следующий пример кода раньше возвращал меня идентификатор окон прежде, но теперь он не работает и возвращает пустую строку, не знайте почему.

  function GetWindowsID: string;
  var
    Registry: TRegistry;
    str:string;
  begin
    Registry := TRegistry.Create(KEY_WRITE);
    try
      Registry.Lazywrite := false;
      Registry.RootKey := HKEY_LOCAL_MACHINE;
   //   Registry.RootKey := HKEY_CURRENT_USER;
      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');
      str := Registry.ReadString('ProductId');
      result:=str;
      Registry.CloseKey;
    finally
      Registry.Free;
    end; // try..finally
  end;

Кто-либо может помочь?

6
задан Tofig Hasanov 19 April 2010 в 11:03
поделиться

3 ответа

Это потому, что виртуализированный ключ '\ Software \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \' не содержит элемента 'ProductID'.

Измените свой код, чтобы создать экземпляр TRegistry с

Registry := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);

, где KEY_WOW64_64KEY = $ 0100. Это даст вам ожидаемый результат.

В качестве альтернативы используйте DSiWin32 и вызовите

DSiReadRegistry('\Software\Microsoft\Windows NT\CurrentVersion', 
  'ProductID', '', HKEY_LOCAL_MACHINE, KEY_QUERY_VALUE OR KEY_WOW64_64KEY);
23
ответ дан 8 December 2019 в 04:08
поделиться

Я бы сказал, что это вызвано UAC - попробуйте запустить как администратор!

Если он работает при запуске от имени администратора, то вам нужно изменить запрос на чтение, чтобы использовать режим только для чтения (не на рабочем месте в МО, поэтому не могу точно вспомнить, как вы это делаете)

редактировать:

function GetWindowsID: string; 
var 
  Registry: TRegistry; 
  str:string; 
begin 
  Registry := TRegistry.Create(KEY_READ); 
  try 
    Registry.RootKey := HKEY_LOCAL_MACHINE; 
 //   Registry.RootKey := HKEY_CURRENT_USER; 
    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'); 
    str := Registry.ReadString('ProductId'); 
    result:=str; 
    Registry.CloseKey; 
  finally 
    Registry.Free; 
  end; // try..finally 
end; 
1
ответ дан 8 December 2019 в 04:08
поделиться

Попробуйте прочитать его вручную с помощью RegEdit. Вы можете получить сообщение «Доступ запрещен» из-за проблемы с разрешением, и в этом случае посмотрите на свой уровень и то, как вы получаете к нему доступ.

0
ответ дан 8 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: