1
votes

I am using Inno Setup compiler to create an installer set up for my software. The installer adds a timestamp to the Windows registry during the first installation. When the software is reinstalled, it checks the saved timestamp in Windows registry and if it is more than 90 days from the current date then it should stop the installation? so I am forcing the user to use the software only for 90 days.

I am trying to add 90 days to the current datetime for comparison. There is no option to do this in the datatype TSystemTime. I can add days to a TDateTime variable, but I can't use that variable in the Inno Setup script.

This is my code

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;

I have seen a similar example on Stack Overflow. They have used a constant to compare the datetime. Instead, I am adding 90 days to my saved installation datetime.

Any help will be much appreciated.

1

1 Answers

1
votes

To increment TSystemTime, check performing Arithmetic on SYSTEMTIME.

Though it would probably be difficult to implement 128-bit arithmetic in Inno Setup.


Alternatively, you can implement it on your own:

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;

Use it like:

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