Installation Inno设置-条件禁用目录页

Installation Inno设置-条件禁用目录页,installation,inno-setup,Installation,Inno Setup,使用Inno Setup 5.5.2,我试图根据路径的存在,有条件地跳过安装目录的选择。具体地说,如果“D:\”驱动器可用,我希望将其安装到预定义的位置,而不需要任何提示;如果不可用,请提供带有合理默认值的提示 我的代码适用于DefaultDirName,但不适用于DisableDirPage: [Code] const DefaultDrive = 'D:\'; AppFolder = 'SomeDir'; function GetDefaultDir( Param: Stri

使用Inno Setup 5.5.2,我试图根据路径的存在,有条件地跳过安装目录的选择。具体地说,如果“D:\”驱动器可用,我希望将其安装到预定义的位置,而不需要任何提示;如果不可用,请提供带有合理默认值的提示

我的代码适用于
DefaultDirName
,但不适用于
DisableDirPage

[Code]
const 
   DefaultDrive = 'D:\';
   AppFolder = 'SomeDir';

function GetDefaultDir( Param: String ) : String;
begin
   if DirExists( DefaultDrive ) then begin
      Result := DefaultDrive + AppFolder;
   end else begin
      Result := ExpandConstant('{pf}\') + AppFolder;
   end;
end;

function DefaultDirValid( Param: String ) : Boolean;
begin
   Result := DirExists( DefaultDrive );
end;

[Setup]
; Works as expected
DefaultDirName={code:GetDefaultDir}

...

; Compiler Error - Value of [Setup] section directive "DisableDirPage" is invalid.
DisableDirPage={code:DefaultDirValid}
我曾尝试使用
DisableDirPage
函数返回“yes”和“no”字符串,以及0和1的整数。我还尝试将调用内联到
DirExists
。它们都产生了相同的编译器错误

我最好的猜测是,这与
DisableDirPage
采用是、否或自动三种状态有关。是否存在需要返回的与三态逻辑相关联的特定类型?上的Inno帮助仅说明:

被调用函数必须有一个名为Param的字符串参数,并且必须根据常量的使用位置返回字符串或布尔值

DefaultDrive
常量路径与以下脚本一起存在时,可以使用事件处理程序跳过目录选择页面:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetDefaultDir}

[Code]
const 
  DefaultDrive = 'D:\';
  AppFolder = 'Some Folder';

function GetDefaultDir(Param: string): string;
begin
  Result := DefaultDrive + AppFolder;
  if not DirExists(DefaultDrive) then
    Result := ExpandConstant('{pf}\') + AppFolder;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := (PageID = wpSelectDir) and DirExists(DefaultDrive);
end;

这是
ShouldSkipPage
事件处理程序的任务。工作非常出色,谢谢!出于好奇,有没有办法为DisableDirPage编写响应代码,或者是因为存在ShouldSkipPage事件处理程序而被禁止?这是一个很好的问题,从尝试使用
string
作为
DefaultDirValid
函数的结果类型的快速测试中可以看出,编译器因无效值而失败,所以它可能是被禁止的。通常情况下,常量只适用于那些采用字符串值的设置(并且只在运行时使用)。因此,大多数布尔设置不支持代码函数,但通常有其他选项。@Miral,agree,但不是布尔指令。它接受3个可能的值这就是我试图返回字符串的原因。它最初是一个布尔指令,现在是一个小的枚举指令。基本上是一样的;它只是在最终的安装程序中被编码到位标志中,所以它没有任何地方可以存储常量。此外,这也是
应该跳过年龄的原因。