При работе с Inno Setup в контексте 64-битных операционных систем, может возникнуть проблема с чтением Machine GUID из реестра. Это связано с тем, что Inno Setup является 32-битным процессом, и для доступа к 64-битному разделу реестра необходимо использовать специальный ключ HKEY_LOCAL_MACHINE_64.
Проблема
Пользователь столкнулся с проблемой при попытке прочитать Machine GUID из реестра с помощью функции RegQueryStringValue в Inno Setup. Код, который должен был выполнить чтение, выглядит следующим образом:
procedure StoreHwID();
var
HwId: String;
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Cryptography', 'MachineGuid', HwId);
MsgBox('Value is "' + HwId + '"', mbInformation, MB_OK);
end;
Однако значение в переменной HwId не устанавливается, и код не работает корректно на 64-битных операционных системах.
Решение
Для решения данной проблемы необходимо использовать ключ HKEY_LOCAL_MACHINE_64 вместо HKEY_LOCAL_MACHINE. Это позволит Inno Setup обращаться к 64-битному разделу реестра, где и хранится Machine GUID.
Исправленный код будет выглядеть следующим образом:
procedure StoreHwID();
var
HwId: String;
Is64Bit: Integer;
begin
Is64Bit := IsWin64();
if Is64Bit then
RegQueryStringValue(HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Cryptography', 'MachineGuid', HwId)
else
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Cryptography', 'MachineGuid', HwId);
MsgBox('Value is "' + HwId + '"', mbInformation, MB_OK);
end;
В данном примере используется функция IsWin64(), которая возвращает True, если операционная система является 64-битной. В зависимости от этого, выбирается соответствующий ключ реестра.
Альтернативный ответ
Альтернативный способ не требует использования двух вызовов RegQueryStringValue. Вместо этого, можно определить, является ли операционная система 64-битной, и на основе этого результата выбрать нужный ключ реестра, сохраняя его в целочисленной переменной, которая затем используется в вызове RegQueryStringValue.
Подтвержденный ответ
Подтвержденное решение заключается в использовании ключа HKEY_LOCAL_MACHINE_64 для доступа к Machine GUID на 64-битных операционных системах при работе с Inno Setup.
В этой статье мы рассмотрели, как исправить ошибку при чтении Machine GUID из реестра в Inno Setup, особенно на 64-битных системах. Мы обсудили, почему стандартный подход не работает, и предоставили исправленный код, который учитывает особенности 64-битных операционных систем. В примерах кода использовался язык Object Pascal, который является стандартным для Delphi и Inno Setup.
Проблема связана с чтением Machine GUID из реестра в Inno Setup на 64-битной системе, где необходимо использовать специальный ключ `HKEY_LOCAL_MACHINE_64` для доступа к 64-битному разделу реестра.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS