Инкрементная дата внедрения пробного периода с использованием Inno Setup - PullRequest
0 голосов
/ 03 января 2019

Я использую Inno Setup компилятор для создания установщика, настроенного для моего программного обеспечения.Установщик добавляет метку времени в реестр Windows во время первой установки.Когда программное обеспечение переустанавливается, оно проверяет сохраненную временную метку в реестре Windows и, если она превышает 90 дней с текущей даты, то оно должно остановить установку?поэтому я заставляю пользователя использовать программное обеспечение только в течение 90 дней.

Я пытаюсь добавить 90 дней к текущей дате и времени для сравнения.Нет возможности сделать это в типе данных TSystemTime.Я могу добавить дни к переменной TDateTime, но я не могу использовать эту переменную в сценарии установки Inno.

Это мой код

function InitializeSetup(): Boolean;
var
  InstallDatetime: string;
begin
  if RegQueryStringValue(HKLM, 'Software\Company\Player\Settings', 'DateTimeInstall', InstallDatetime) then
    { I want to add 90 days before comparison }
    Result := CompareStr(GetDateTimeString('yyyymmdd', #0,#0), InstallDatetime) <= 0;
  if not result then
    MsgBox('This Software trial period is over. The Program will not install.', mbError, MB_OK);
    Result := True;
end;

Я видел похожий пример в переполнении стека.Они использовали константу для сравнения даты и времени.Вместо этого я добавляю 90 дней к сохраненной дате установки.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 03 января 2019

Чтобы увеличить TSystemTime, установите флажок , выполняющий арифметику на SYSTEMTIME .

Хотя, вероятно, будет сложно реализовать 128-битную арифметику в Inno Setup.


В качестве альтернативы, вы можете реализовать его самостоятельно:

procedure IncDay(var Year, Month, Day: Integer);
var
  DIM: Integer;
begin
  Inc(Day);
  case Month of
    1, 3, 5, 7, 8, 10, 12: DIM := 31;
    2: if (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0)) then
         DIM := 29
       else
         DIM := 28;
    4, 6, 9, 11: DIM := 30;
  end;
  if Day > DIM then
  begin
    Inc(Month);
    Day := 1;
    if Month > 12 then
    begin
      Inc(Year);
      Month := 1;
    end;
  end;
end;

procedure IncDays(var Year, Month, Day: Integer; Days: Integer);
begin
  while Days > 0 do
  begin
    IncDay(Year, Month, Day);
    Dec(Days);
  end;
end;

function IncDaysStr(S: string; Days: Integer): string;
var
  Year, Month, Day: Integer;
begin
  Year := StrToInt(Copy(S, 1, 4));
  Month := StrToInt(Copy(S, 5, 2));
  Day := StrToInt(Copy(S, 7, 2));
  IncDays(Year, Month, Day, Days);
  Result := Format('%.4d%.2d%.2d', [Year, Month, Day]);
end;

Использовать как:

result :=
  CompareStr(GetDateTimeString('yyyymmdd', #0,#0), IncDaysStr(InstallDatetime, 90)) <= 0;
...