inno-setupramminimum-requirements

How can I check system specs in Inno Setup 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 Inno Setup 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 'GlobalMemoryStatusEx@kernel32.dll 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;