如何在 Inno Setup 安装之前更改 defaultdirname 参数?

5

我想要更改ssInstall部分中的defaultdirname参数。我该如何做?是否有一种设置[Setup]参数的函数。

3个回答

11
以下全局对象可用: 类型为TMainForm的MainForm,类型为TWizardForm的WizardForm和类型为TUninstallProgressForm的UninstallProgressForm以及一个特殊常量:类型为TControl.Cursor的crHand。
如果您想在向导中设置默认目录,只需像在普通的Delphi代码中一样访问其组件。
例如,将目录设置为自定义值:
WizardForm.DirEdit.Text := 'c:\test';

你可以使用WizardDirValue函数来读取该值。

我说“只是访问”……但我花了一个小时才弄明白 ;)


3

似乎没有办法通过脚本更改脚本常量。
我认为最好的方法是修改[Files]部分中每个条目的目标目录,例如:

[Files]
Source: "MYPROG.EXE"; DestDir: "{code:NewTargetDir}"

您可以按照以下方式推导出新的安装目录:

[Code]
function NewTargetDir(Param: String): String;
begin
  Result := ExpandConstant('{app}') + '\MySubDir';
end;

自从NewTargetDir函数在文件实际复制之前被调用,这应该可以正常工作。
然而,我认为你应该重新考虑你的方法。首先要求用户指定安装目录,然后实际上安装到另一个目录,这似乎是你的意图,是错误的方式,以我个人的看法。您真的有充分的理由安装到用户指定的目录之外吗?此外,通过指定参数也可以实现我的示例代码的结果。
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}\MySubDir"

无需任何脚本即可完成。如果不确定,选择更简单的解决方案。


1
我已将另一个(宿主应用程序)安装程序嵌入到插件安装程序中。插件在启动时检查来自注册表(宿主应用程序的)安装路径。但是,如果它尚未安装,则此路径在该时刻未定义。然后,在实际安装开始之前,插件安装程序会启动宿主应用程序安装程序。这是我想要更新dirname以使用(现在定义的)宿主应用程序安装路径的时刻。这就是我需要编辑installdir的地方。事实上,在这种情况下,Inno会将文件安装到正确的目录,但不包括unins000.exe/dat文件,这很奇怪。 - versioner
好的,这在我的书中算是一个“令人信服的理由”;-) - Treb

2

我有一个类似的情况,安装程序通过命令行接收安装路径。 我正在使用Jonx提出的解决方案:

WizardForm.DirEdit.Text := 'c:\test';

例子:

function CompareParameter(param, expected: String): Boolean;
begin
  Result := False;
  if Length(param) >= Length(expected) then
  begin
    if CompareText(Copy(param, 1, Length(expected)), expected) = 0 then
    begin
      Result := True;
    end;
  end;
end;

function GetParameter(expectedParam: String): String;
var
  i : LongInt;
begin
  Result := '';
  for i := 0 to ParamCount() do
  begin
    if CompareParameter(ParamStr(i), '/' + expectedParam + '=') then
    begin
      Result := Copy(ParamStr(i), Length(expectedParam) + 3, Length(ParamStr(i)));
      break;
    end;
  end;
end;

procedure InitializeWizard();
var
  newInstallFolder: String;
begin
  newInstallFolder := GetParameter('INSTALL_FOLDER');
  if Length(newInstallFolder) > 2 then
  begin
    if Copy(newInstallFolder, 1, 1) = '"' then
      newInstallFolder := Copy(newInstallFolder, 2, Length(newInstallFolder) - 2)
    if Length(newInstallFolder) > 1 then
      WizardForm.DirEdit.Text := newInstallFolder;
  end;
end;

设置应用程序是从另一个设置中以静默模式启动的。这对我来说可以正常工作。


1
你不需要这样做;Inno Setup生成的安装程序已经接受/dir参数。 - Thomas Levesque
此外,即使您确实想这样做(其实您不需要这样做),Inno也支持使用“{param:...}”常量来解析命令行参数的更简单方法。 - Miral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接