InnoSetup — это удобный инструмент для создания установщиков Windows-приложений. Одной из задач, которые часто приходится решать при создании установщика, является настройка пути установки приложения. В этой статье мы рассмотрим, как правильно задать путь установки приложения, используя данные из реестра, и как расширить переменные среды в пути установки.
Проблема
При попытке задать путь установки приложения из значения реестра, используя синтаксис {reg:...|...}, мы столкнулись с проблемой: переменная среды не расширялась, а путь из реестра просто добавлялся к пути по умолчанию.
Например, мы хотим задать путь установки приложения из значения реестра HKCU\Software\Microsoft\VisualStudio\14.0,VisualStudioLocation, добавив к нему путь по умолчанию {userdocs}\Visual Studio 2015. Мы ожидаем получить путь:
C:\Users\Administrator\Documents\Visual Studio 2015
Но вместо этого получаем:
C:\Users\Administrator\Desktop\%USERPROFILE%\Documents\Visual Studio 2015
Причина проблемы
Проблема заключается в том, что InnoSetup не расширяет переменные среды в пути установки, если они не являются частью пути по умолчанию. В нашем случае переменная %USERPROFILE% не является частью пути по умолчанию, поэтому она не расширяется.
Решение
Для решения этой проблемы можно воспользоваться следующим "хаком": использовать функцию ExpandEnvironmentStrings из библиотеки ядра Windows для расширения переменных среды в пути установки.
Вот пример кода, который демонстрирует это решение:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetDefaultDirName}
[Code]
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
const
RegKeyVS2015 = 'Software\Microsoft\VisualStudio\14.0';
function ExpandEnvironmentStrings(lpSrc: string; lpDst: string; nSize: DWORD): DWORD;
external 'ExpandEnvironmentStrings{#AW}@kernel32.dll stdcall';
function ExpandEnvVars(const Input: string): string;
var
Buf: string;
BufSize: DWORD;
begin
BufSize := ExpandEnvironmentStrings(Input, #0, 0);
if BufSize > 0 then
begin
SetLength(Buf, BufSize); // The internal representation is probably +1 (0-termination)
if ExpandEnvironmentStrings(Input, Buf, BufSize) = 0 then
RaiseException(Format('Expanding env. strings failed. %s', [SysErrorMessage(DLLGetLastError)]));
#if AW == "A"
Result := Copy(Buf, 1, BufSize - 2);
#else
Result := Copy(Buf, 1, BufSize - 1);
#endif
end
else
RaiseException(Format('Expanding env. strings failed. %s', [SysErrorMessage(DLLGetLastError)]));
end;
function GetDefaultDirName(Param: string): string;
begin
if RegQueryStringValue(HKCU, RegKeyVS2015, 'VisualStudioLocation', Result) then
Result := ExpandEnvVars(Result)
else
Result := ExpandConstant('{userdocs}\Visual Studio 2015');
end;
В этом примере мы определяем функцию ExpandEnvVars, которая расширяет переменные среды в заданной строке. Затем, в функции GetDefaultDirName, мы проверяем, получено ли значение из реестра. Если да, то мы расширяем переменные среды в этом значении с помощью функции ExpandEnvVars. Если значение не получено, то мы просто возвращаем путь по умолчанию.
Альтернативный ответ
В качестве альтернативного решения можно рассмотреть использование скрипта batch для расширения переменных среды в пути установки. Для этого можно воспользоваться параметром Run в секции [Run], чтобы запустить скрипт batch перед установкой приложения. В скрипте batch можно использовать команду set для расширения переменных среды в пути установки.
Пример скрипта batch:
@echo off
set "DefaultDirName=C:\Users\Administrator\Documents\Visual Studio 2015"
exit /b 0
В этом примере мы задаем переменную DefaultDirName со значением пути установки приложения. Этот путь затем можно использовать в установщике InnoSetup.
Вывод
В этой статье мы рассмотрели проблему, связанную с расширением переменных среды в пути установки приложения в InnoSetup. Мы рассмотрели причину проблемы и предложили два решения: использование функции ExpandEnvironmentStrings из библиотеки ядра Windows и использование скрипта batch для расширения переменных среды. Оба решения позволят правильно задать путь установки приложения, используя данные из реестра.
Статья описывает решение проблемы с расширением переменных среды в пути установки приложения в InnoSetup, когда данные берутся из реестра.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.