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

Работа с путями установки в InnoSetup

Delphi , Программа и Интерфейс , Инсталяция

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




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


:: Главная :: Инсталяция ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:26:22/0.0055069923400879/1