Inno设置搜索现有文件

时间:2013-02-12 18:52:32

标签: inno-setup

如何搜索现有的exe文件,然后将该目录用于我的安装程序?

如果找不到exe文件,我希望用户浏览路径。如果exe文件安装在其他地方。

Senario 1(最常见的情况):

默认目录是c:\ test \ My program

这应显示为“选择目的地位置”页面上的路径 当用户按下Next时,应该进行检查。确保存在默认目录(c:\ test \ My program) 如果存在,用户应该继续执行“准备安装”页面。

Senario 2(极少情况):

默认目录是c:\ test \ My program

这应显示为“选择目的地位置”页面上的路径 当用户按下Next时,应该进行检查。确保存在默认目录(c:\ test \ My program) 如果它不存在,用户应该提示“我的程序”的路径。然后,用户应继续进入“准备安装”页面。 然后我只相信用户选择了正确的路径

我怎样才能在InnoSetup中做到这一点?

2 个答案:

答案 0 :(得分:3)

我的安装程序已经做了类似的事情。我做的第一件事是需要从程序中读取注册表值,如果该注册表值不存在,那么我选择该程序的默认目录。例如:

DefaultDirName={reg:HKLM\Software\Activision\Battlezone II,STInstallDir|reg:HKLM\Software\Activision\Battlezone II,Install121Dir|{pf32}\Battlezone II}

现在,用户运行安装程序,并且必须检查程序是否在正确的文件夹中。它通过检查程序的可执行文件是否已存在来实现。我用这段代码就可以了。

{ Below code warns end user if he tries to install into a folder that does not contain bzone.exe. Useful if user tries to install into addon or any non-BZ2 folder. }
function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Log('NextButtonClick(' + IntToStr(CurPageID) + ') called');
  case CurPageID of
    wpSelectDir:
    if not FileExists(ExpandConstant('{app}\bzone.exe')) then begin
      MsgBox('Setup has detected that that this is not the main program folder of a Battlezone II install, and the created shortcuts to launch {#MyAppName} will not work.' #13#13 'You should probably go back and browse for a valid Battlezone II folder (and not any subfolders like addon).', mbError, MB_OK);
      end;
    wpReady:
  end;
  Result := True;
end;

上面的代码只是检查目标可执行文件是否存在,如果不存在则警告用户,让他有机会返回并更改目录,但也可以继续进行安装。

此外,由于您似乎要在现有程序中安装补丁或插件,我建议您设置

DirExistsWarning=no
AppendDefaultDirName=false

如果您不创建开始菜单条目,可选择防止不必要的屏幕

DisableProgramGroupPage=yes

答案 1 :(得分:2)

我会创建一个文件输入页面,让用户手动选择Picture.exe二进制位置,当它在预期位置找不到时。

您可以按照此代码的commented version

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "CurrentBinary.exe"; DestDir: "{app}"
Source: "PictureExtension.dll"; DestDir: "{code:GetDirPath}"

[Code]
var
  FilePage: TInputFileWizardPage;

function GetDirPath(const Value: string): string;
begin
  Result := '';
  if FileExists(FilePage.Values[0]) then
    Result := ExtractFilePath(FilePage.Values[0]);
end;         

procedure InitializeWizard;
var
  FilePath: string;
begin
  FilePage := CreateInputFilePage(wpSelectDir, 'Select Picture.exe location', 
    'Where is Picture.exe installed ?', 'Select where Picture.exe is located, ' +
    'then click Next.');
  FilePage.Add('Location of Picture.exe:', 'Picture project executable|Picture.exe', 
    '.exe');

  FilePage.Edits[0].ReadOnly := True;
  FilePage.Edits[0].Color := clBtnFace;

  FilePath := ExpandConstant('{pf}\Picture\Picture.exe');
  if FileExists(FilePath) then
    FilePage.Values[0] := FilePath;
end;