从Inno Pascal设置DestDir?

时间:2012-06-07 22:04:44

标签: inno-setup

我想在不同文件夹中安装文件,具体取决于用户是选择为所有用户安装还是仅安装当前用户。

我添加了使用CreateInputOptionPage()来创建带有两个单选按钮的选项页面。

然而,我的安装程序现在散落着许多重复的行,比如这两行:

Source: {#ProjectRootFolder}\License.txt; DestDir: {userdocs}\{#MyAppName}; Check: NOT IsAllUsers
Source: {#ProjectRootFolder}\License.txt; DestDir: {commondocs}\{#MyAppName}; Check:IsAllUsers

有更优雅的方式来做上述事情吗?例如,Pascal代码可以创建一个像#define这样的变量,所以我可以用它代替上面的{userdocs}和{commondocs}吗?

进一步详情:

上面的IsAllUsers()函数调用此代码:

function IsAllUsers: Boolean;
begin
#ifdef UPDATE
  Result := AllUsersInRegistryIsTRUE;
#else
  Result := AllUsersOrCurrentUserPage.Values[1]; // wizard page second radio button
#endif
end; 

function AllUsersInRegistryIsTRUE: Boolean;  // True if preceding install was to all users' documents 
var
  AllUsersRegValue: AnsiString;
begin
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\MyApp', 'AllUsers', AllUsersRegValue) then
    Result := (UpperCase(AllUsersRegValue) = 'YES')
  else
    Result := FALSE;
end; 

1 个答案:

答案 0 :(得分:7)

这样的事情会适合吗?

[Files]
Source: {#ProjectRootFolder}\License.txt; DestDir: {code:GetDir}\{#MyAppName};

...

[Code]
var
  OptionsPage: TInputOptionWizardPage;

procedure InitializeWizard;
begin
  OptionsPage := CreateInputOptionPage(wpUserInfo, 
              'please select', 'the kind of installation', 'and continue..', 
              True, False);
  OptionsPage.Add('All users');
  OptionsPage.Values[0] := True;
  OptionsPage.Add('This user');
end;

function GetDir(Dummy: string): string;
begin
  if OptionsPage.Values[0] then
    Result := ExpandConstant('{commondocs}')
  else
    Result := ExpandConstant('{userdocs}');
end;