Inno Setup проверяет версию внешнего приложения - PullRequest
0 голосов
/ 18 сентября 2018

То, чего я пытаюсь добиться, - это проверить, установлен ли уже Node.js, и если да, то я хочу проверить, что версия обновлена, скажем, 8.xx

Из вопросаниже я уже добился первоначальной проверки его установки.Мой код выглядит очень похоже на ответ на вопрос.

Использование кода выхода из процесса для отображения сообщения об ошибке для определенного файла в [Выполнить]

Теперь я борюсь с чтением фактического вывода команды node -v(Ожидаемый результат - строка, содержащая версию).

Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 18 сентября 2018

Запуск приложения и анализ его вывода - довольно неэффективный способ проверить, существует ли оно и его версия.Вместо этого используйте функции FileSearch (node.exe добавлено к PATH) и GetVersionNumbers.

[Code]

function CheckNodeJs(var Message: string): Boolean;
var
  NodeFileName: string;
  NodeMS, NodeLS: Cardinal;
  NodeMajorVersion, NodeMinorVersion: Cardinal;
begin
  { Search for node.exe in paths listed in PATH environment variable }
  NodeFileName := FileSearch('node.exe', GetEnv('PATH'));
  Result := (NodeFileName <> '');
  if not Result then
  begin
    Message := 'Node.js not installed.';
  end
    else
  begin
    Log(Format('Found Node.js path %s', [NodeFileName]));
    Result := GetVersionNumbers(NodeFileName, NodeMS, NodeLS);
    if not Result then
    begin
      Message := Format('Cannot read Node.js version from %s', [NodeFileName]);
    end
      else
    begin
      { NodeMS is 32-bit integer with high 16 bits holding major version and }
      { low 16 bits holding minor version }

      { shift 16 bits to the right to get major version }
      NodeMajorVersion := NodeMS shr 16; 
      { select only low 16 bits }
      NodeMinorVersion := NodeMS and $FFFF;
      Log(Format('Node.js version is %d.%d', [NodeMajorVersion, NodeMinorVersion]));
      Result := (NodeMajorVersion >= 8);
      if not Result then
      begin
        Message := 'Node.js is too old';
      end
        else
      begin
        Log('Node.js is up to date');
      end;
    end;
  end;
end;

function InitializeSetup(): Boolean;
var
  Message: string;
begin
  Result := True;
  if not CheckNodeJs(Message) then
  begin
    MsgBox(Message, mbError, MB_OK);
    Result := False;
  end;
end;

Для аналогичного вопросасм. Проверка, установлен ли Chrome и имеет ли он определенную версию, с помощью Inno Setup .

...