Positive MA
Positive MA

Reputation: 43

How to verify if program is installed in system with Inno Setup Pascal Script?

I want to verify if user has Docker installed in their system. If it is installed proceed further otherwise display an error message.

Previously I was looking at the registry group in Windows but it's not the correct way. I want to check if cmd gives correct output for command docker.

function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;
end;

function GetHKU: Integer;
begin
  if IsWin64 then
    Result := HKCU64
  else
    Result := HKCU32;
end;

function InitializeSetup: Boolean;
begin
  // Opening the setup installer initially
  Result := True;
  //if the docker is present in the machine registry return True else checking user registry
  if not RegKeyExists(GetHKLM, 'SOFTWARE\Docker Inc.') then
  begin
    if not RegKeyExists(GetHKU, 'Software\Docker Inc.') then
    begin   
      // return False to prevent installation to continue 
      Result := False;
      // Display that you need to install docker.
      SuppressibleMsgBox('<Docker not found!>', mbCriticalError, MB_OK, IDOK);
    end;
  end;
end;

How do I do this with just cmd? Instead of checking registry.. How can I run the command line and verify the output?

for etc:

function checkdocker() :Boolean;
var
  dockerfound: string;
begin
  Result :=    
    ShellExecute(application.handle, 'docker', nil, nil, SW_MAXIMIZE)
end;

function InitializeSetup: Boolean;
begin
  Result := True;
  if not checkdocker then;
    SuppressibleMsgBox('<Docker not found!>', mbCriticalError, MB_OK, IDOK);
  else
    #continue
end;

Upvotes: 4

Views: 537

Answers (1)

Martin Prikryl
Martin Prikryl

Reputation: 202272

To answer your literal question: Just use Exec and check the result code:

function CheckDocker: Boolean;
var
  ResultCode: Integer;
begin
  Result :=
    Exec('docker', '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
    (ResultCode = 0);

  if Result then Log('Succeeded executing docker')
    else Log('Failed to execute docker');
end;

(based on How to get an output of an Exec'ed program in Inno Setup?)


Though there's more efficient way to check if docker.exe executable is in a search path. Use FileSearch. See How can I check SQLCMD.EXE if it is installed on client in Inno Setup.

Upvotes: 4

Related Questions