Search code examples
inno-setupramminimum-requirements

Inno Setup - How can I check system specs before/during installation?


In particular, I'd like to check the amount of RAM installed on the PC. If it's less than 1GB, I'd like to show a warning message before/during the installation...


Solution

  • I would personally do this check at the beginning of the setup to not disappoint the user going through the installation wizard. To do this, I would display the warning before the wizard is actually shown as its used in the following script. It should warn the user when the memory is below 1073,741.824 B (1GB) of physical memory detected on the machine. If the user disagree with the warning, the setup is terminated; if there's more than the mentioned amount of actual physical memory or the user accepted the warning, the setup process continues:

    [Code]
    type
      { the following mapping of the DWORDLONG data type is wrong; }
      { the correct type is a 64-bit unsigned integer which is not }
      { available in InnoSetup Pascal Script at this time, so max. }
      { values of the following fields will be limited to quite a }
      { big reserve of 8589,934.592 GB of RAM; I hope enough for }
      { the next versions of Windows :-) }
      DWORDLONG = Int64;
      TMemoryStatusEx = record
        dwLength: DWORD;
        dwMemoryLoad: DWORD;
        ullTotalPhys: DWORDLONG;
        ullAvailPhys: DWORDLONG;
        ullTotalPageFile: DWORDLONG;
        ullAvailPageFile: DWORDLONG;
        ullTotalVirtual: DWORDLONG;
        ullAvailVirtual: DWORDLONG;
        ullAvailExtendedVirtual: DWORDLONG;
      end;
    
    function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL;
      external '[email protected] stdcall';
    
    function InitializeSetup: Boolean;
    var
      MemoryStatus: TMemoryStatusEx;
    begin
      { allow the installation (even if the GlobalMemoryStatusEx call fails) }
      Result := True;
      { that's the requirement of the function call; you must set the size }
      { of the passed structure in bytes }
      MemoryStatus.dwLength := SizeOf(MemoryStatus);
      { if the GlobalMemoryStatusEx function call succeed, then... }
      if GlobalMemoryStatusEx(MemoryStatus) then
      begin
        MsgBox(Int64ToStr(MemoryStatus.ullTotalPhys), mbInformation, MB_OK);
    
        { if the amount of actual physical memory in bytes is less than }
        { 1073,741.824 B (1 GB), then show a warning message and according }
        { to user's decision abort the installation }
        if MemoryStatus.ullTotalPhys < 1073741824 then
        begin
          if MsgBox('You have less than 1GB of physical memory available. ' +
            'Are you sure you want to continue with the installation ?', 
            mbConfirmation, MB_YESNO) = IDNO
          then
            Result := False;
        end;
      end;
    end;