Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как читать значения из реестра в Delphi 7 на 64-битной Windows 7: решение проблемы с Licence ID

Delphi , ОС и Железо , Реестр

Как читать значения из реестра в Delphi 7 на 64-битной Windows 7

Вопрос чтения значений из реестра в среде Delphi 7 на 64-битной операционной системе Windows 7 может вызвать сложности, связанные с различиями в структуре реестра между 32-битными и 64-битными системами. В данной статье мы рассмотрим, как решить проблему с чтением Licence ID, используя примеры кода на Object Pascal.

Проблема с чтением реестра в Delphi 7

При работе с реестром в Delphi 7 на 64-битной системе может возникнуть ситуация, когда программа не может корректно прочитать значения, поскольку Windows 64-бит может перенаправлять запросы в 32-битный реестр. Это происходит из-за того, что 64-битная версия Windows имеет отдельный раздел реестра для 32-битных приложений, известный как Wow6432Node.

Пример кода для чтения реестра

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

Registry := TRegistry.Create(KEY_READ);
try
  Registry.Lazywrite := False;
  Registry.RootKey := HKEY_LOCAL_MACHINE;
  if CheckForWinNT then
    Registry.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion')
  else
    Registry.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion');
  Result := Registry.ReadString('ProductID');
finally
  Registry.CloseKey;
  Registry.Free;
end;

Решение проблемы с Licence ID

Проблема заключается в том, что при создании экземпляра TRegistry с флагом KEY_READ и дополнительным флагом KEY_WOW64_64KEY ($0100) вы должны обращаться к 64-битному разделу реестра. Однако, использование метода OpenKeyReadOnly сбрасывает установленный флаг до KEY_READ, что приводит к неправильному чтению значений из реестра.

Чтобы решить эту проблему, используйте метод OpenKey вместо OpenKeyReadOnly, который не будет сбрасывать установленные флаги доступа:

Registry := TRegistry.Create(KEY_READ OR $0100);
try
  Registry.Lazywrite := False;
  Registry.RootKey := HKEY_LOCAL_MACHINE;
  if CheckForWinNT then
    Registry.OpenKey('\Software\Microsoft\Windows NT\CurrentVersion')
  else
    Registry.OpenKey('\Software\Microsoft\Windows\CurrentVersion');
  Result := Registry.ReadString('ProductID');
finally
  Registry.CloseKey;
  Registry.Free;
end;

Определение 64-битной операционной системы

Чтобы определить, запущена ли программа на 64-битной операционной системе, можно использовать следующий код:

function Is64BitOS: Boolean;
type
  TIsWow64Process = function(Handle: THandle; var IsWow64: BOOL): BOOL; stdcall;
var
  hKernel32: Integer;
  IsWow64Process: TIsWow64Process;
  IsWow64: BOOL;
begin
  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
      Result := IsWow64;
    else
      RaiseLastOSError;
  end;
  FreeLibrary(hKernel32);
end;

Чтение Licence ID для 64-битной системы

Для чтения Licence ID в 64-битной системе, если вы используете Delphi 2010 или более позднюю версию, можно использовать следующий пример:

reg := TRegistry.Create(KEY_READ);
try
  with reg do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKey('\SOFTWARE\Wow6432Node\...', False) then
      // Чтение значений из реестра
finally
  reg.Free;
end;

Важно отметить, что в случае использования Delphi 7, вам необходимо явно указать флаг KEY_WOW64_64KEY при создании экземпляра TRegistry, чтобы обеспечить доступ к 64-битному разделу реестра.

Используя эти рекомендации, вы сможете корректно читать значения из реестра в среде Delphi 7 на 64-битной Windows 7 и решить проблему с Licence ID.

Создано по материалам из источника по ссылке.

Вопрос связан с чтением данных из реестра в среде разработки Delphi 7 на 64-битной версии Windows 7, учитывая особенности доступа к реестру в 64-битных системах.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:42:56/0.0053071975708008/1