коды возврата msi в Установке Inno

sql.NullInt64 существует, потому что SQL null нельзя представить как Go int. Это третье состояние, которое не может быть представлено ни одним значением int.

Одним из решений этой проблемы было бы представление таких значений SQL как *int, но для этого потребовалось бы выделение для случаев, когда значение не равно null в базе данных, и выделения плохо влияют на производительность.

Разработчики пакета SQL придумали решение NullInt64, которое кодирует третье состояние нуля в качестве дополнительного Valid логического значения. Это не хорошее решение, но лучшее, что мы можем получить.

Я не уверен, возможно ли написать маршаллер JSON для NullInt64, который бы работал так, как вы ожидаете.

По-прежнему существует проблема «третьего состояния» при сортировке в JSON. С ,omitempty было бы также опущено 0 int, так как вы можете отличить 0 от «не существует» / null?

В любом случае они не написали собственный маршаллер для NullInt64, поэтому он просто кодирует как структура, которая это есть.

Вы можете создать тип псевдонима для NullInt64, написать маршаллер JSON для кодирования того, как вы хотите, в JSON (вам нужен псевдоним, потому что вы не можете добавлять методы к типам из других пакетов). Вам также нужно будет разыграть между NullInt64 и sql.NullInt64.

8
задан Mihai Limbășan 22 March 2009 в 18:24
поделиться

1 ответ

В настоящее время нет никакого способа проверить успешное выполнение [Выполненных] записей. Код просто регистрирует код выхода процесса и продолжает следующую запись (это может быть исследовано в исходном файле Установки Inno Main.pas, функцией является ProcessRunEntry (), запускающийся в строке 3404 в текущей версии 5.2.3).

Если необходимо удостовериться, что несколько выполнения msiexec были все успешны, необходимо будет кодировать промежуточный слой. Это может быть столь же просто как маленький тупик, который выполняется в [Выполнение] записи и запускает msiexec.exe с корректных параметров, ожидает процесса для окончания, затем пишет код возврата в файл.

Другой способ проверить на успех такого действия по установке состоял бы в том, чтобы добавить пользовательский вызов процедуры каждого [Выполнение] запись при помощи Параметра AfterInstall. В такой функции Вы могли, например, проверить, было ли управление OCX успешно установлено:

[Run]
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1

[Code]
var
  MyInstallation1Success: boolean;

procedure AfterMyInstallation1;
var
  V: Variant;
begin
  try
    V := CreateOleObject('MyInstallation.InstalledOcxControl.1');
    MyInstallation1Success := True;
  except
    MyInstallation1Success := False;
  end;
end;

или ли каталоги и ключи реестра для зависимости - все там.

Каждый [Выполнение] запись только выполняется, когда ее дополнительный параметр Проверки действительно возвращает true. Таким образом в зависимости от Ваших потребностей Вы могли или начать все установки без диалогов один за другим, и после того, как последнее закончилось, выполняют функцию сценария, чтобы проверить, что все зависимости были успешно установлены; или Вы могли записать функцию проверки для каждой установки зависимости, которая затем возвратит false и таким образом пропустит все другие установки после первой неудавшейся.

Обратите внимание однако, что весь [Выполнение] записи выполняются после шагов для копирования файла и т.д. завершается реестр, пишущий, таким образом, Вы в основном уже закончены с установкой. Если Вы хотите действительно выполнить все свои действия по установке только, когда все зависимости правильно установлены, то необходимо было бы сделать это ранее в процессе, когда установка может все еще быть отменена.

Править: Проверьте вопрос, "Как Вы заставляете Установку Inno не выглядеть замороженной при выполнении длинного Должностного лица?" где некоторая информация дана, и демонстрационный сценарий связан с об использованием Должностного лица () функция для установки зависимостей. Таким образом, если Вы не используете [Выполнение] записи, там хороший шанс достигнуть того, что Вы хотите.

5
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: