2016-05-10 15 views
1

Einige Fragen/Lösungen, die ich hier gefunden habe, waren ähnlich, aber nicht ganz das, was ich brauchte.Inno-Setup: Überprüfen Sie, ob die Datei irgendwo in C vorhanden ist: Laufwerk

Ich versuche, ein Installationsprogramm für eine Python-Anwendung zu erstellen, die ich für Windows erstellt habe. Das Installationsprogramm ruft ein anderes Installationsprogramm (openscad_installer.exe) auf, und der Benutzer hat die Wahl, das zu installieren, wo er möchte (d. H. Ich kenne das Ziel nicht und müsste es finden können) oder es gar nicht zu installieren.

Ich muss im Wesentlichen überprüfen, ob die openscad.exe-Datei existiert (d. H. Wenn sie installiert ist) irgendwo auf dem Computer (in C: Laufwerk) und wenn es nicht existiert, muss ich meine Software deinstallieren.

Die Deinstallation scheint einfach zu sein, aber ich weiß nicht, wie ich herausfinden soll, ob die Datei existiert. Danke für die Hilfe.

+0

Siehe [Installation abbrechen, wenn Abhängigkeit nicht installiert werden kann] (http://stackoverflow.com/q/37131619/850848). –

+0

Danke dafür. Wenn es Ihnen nichts ausmacht zu helfen, zu klären ... Die Lösung in diesem Link hat Code: wenn nicht FileExists (ExpandConstant ('{App} \ {# MyAppExeName}')) ... Sagt das, ich muss wissen, wo OpenScad ist Eingerichtet? Danke für den Link. –

+0

Danke, es fällt mir schwer, eine Lösung zu finden, "wenn der Benutzer bereits OpenSec installiert hat", also sollte ich vielleicht den Titel meiner Frage ändern. Ich denke, ich muss das Äquivalent von os.walk (python) in Pascal machen, um die openscad.exe zu finden, aber ich bin mir nicht sicher, wie ich das machen soll. Der Benutzer kann openscad in einem beliebigen Verzeichnis installieren, so dass ich nicht sicher weiß, wo ich es finden kann. Prost. –

Antwort

1

Durchsuchen der Datei in C: Laufwerk (und möglicherweise ein anderes Laufwerk, wie ein Benutzer möglicherweise eine Software irgendwo anders installieren) ist machbar, kann aber ewig dauern.

Ich würde vorschlagen, anstatt Sie eine Existenz des SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD Registrierungsschlüssel überprüfen:

const 
    OpenSCADRegKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD'; 

function PrepareToInstall(var NeedsRestart: Boolean): String; 
var 
    ResultCode: integer; 
begin 
    Exec('OpenSCAD-xxx-Installer.exe', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode); 

    if RegKeyExists(HKEY_CURRENT_USER_32, OpenSCADRegKey) or 
    RegKeyExists(HKEY_CURRENT_USER_64, OpenSCADRegKey) or 
    RegKeyExists(HKEY_LOCAL_MACHINE_32, OpenSCADRegKey) or 
    RegKeyExists(HKEY_LOCAL_MACHINE_64, OpenSCADRegKey) then 
    begin 
    Log('OpenSCAD is installed'); 
    end 
    else 
    begin 
    Log('OpenSCAD is not installed'); 
    // Abort installation 
    Result := 'OpenSCAD is not installed'; 
    Exit; 
    end; 
end; 

Wenn Sie den Montageort wissen müssen, lesen und analysieren, um die UninstallString Wert:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD] 
"UninstallString"="C:\\Program Files\\OpenSCAD\\Uninstall.exe" 

Wenn Sie darauf bestehen, nach openscad.exe zu suchen, verwenden Sie:

function FindFile(RootPath: string; FileName: string): string; 
var 
    FindRec: TFindRec; 
    FilePath: string; 
begin 
    Log(Format('Searching %s for %s', [RootPath, FileName])); 
    if FindFirst(RootPath + '\*', FindRec) then 
    begin 
    try 
     repeat 
     if (FindRec.Name <> '.') and (FindRec.Name <> '..') then 
     begin 
      FilePath := RootPath + '\' + FindRec.Name; 
      if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then 
      begin 
      Result := FindFile(FilePath, FileName); 
      if Result <> '' then Exit; 
      end 
      else 
      if CompareText(FindRec.Name, FileName) = 0 then 
      begin 
      Log(Format('Found %s', [FilePath])); 
      Result := FilePath; 
      Exit; 
      end; 
     end; 
     until not FindNext(FindRec); 
    finally 
     FindClose(FindRec); 
    end; 
    end 
    else 
    begin 
    Log(Format('Failed to list %s', [RootPath])); 
    end; 
end;