2

如果我想在{commonappdata}文件夹中创建文件,我需要在一行中添加Permissions:users-modify参数。[Files] Source:...

这很好用(我终于想出了如何确保从已安装程序中更改已安装文件之一时没有使用漫游文件夹)。

但是,如何使[INI] Filename:...部分的 INI 条目也可由 PC 上的任何用户写入?毕竟有程序价值,而不是用户价值。

就像现在一样,ini 文件是由 Inno-setup 安装编写的,但是如果我稍后启动安装的程序并在语法上更改 ini 文件,则会写入 ini 文件的漫游版本。

要完整:

  • 我知道在安装应用程序时将 ini 文件创建为模板的方法,然后,在第一次运行程序时,将它们复制到{commonappdata}文件夹中,但我只是想知道这是否可以从内部实现Inno-Setup 脚本。

  • 我正在 Windows 7 Prof 64 下运行最新版本的 Inno-Setup 5.4.2(如果这应该有所作为)。

4

2 回答 2

2

你会因为这个设计而受到指责。如果您将用户设置保存在应用程序数据文件夹中,您可能会遇到相互矛盾的用户设置。更多责备请参考这个问题。;)

无论如何,只有 [Files]、[Dirs] 和 [Registry] 部分允许“权限”参数。因此,[Ini] 部分不可能创建具有修改权限的 ini 文件。完成任务的一种方法是在安装过程中使用“ini”部分收集必要的信息,然后作为安装后操作,将 ini 文件的内容传输到具有通过“文件”部分创建的修改权限的文件。像这样的东西:

[Files]
Source: MyProg.ini; DestDir: {commonappdata}\MyCompany; Permissions: users-modify; 
;// ini file contents will be transferred to this file

[Ini]
filename: {commonappdata}\MyCompany\MyProg_Temp.ini; section: users; key: username; string: {username}; Flags: UninsDeleteEntry; 
;// this is used in the installation, and will be deleted in post-install
...

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  s: string;
begin
  if CurStep = ssPostInstall then begin
    if LoadStringFromFile(ExpandConstant('{commonappdata}\MyCompany\MyProg_Temp.ini'), s) and
        SaveStringToFile(ExpandConstant('{commonappdata}\MyCompany\MyProg.ini'), s, False) then
      DeleteFile(ExpandConstant('{commonappdata}\MyCompany\MyProg_Temp.ini'));
  end;
end;
于 2011-04-21T22:15:48.100 回答
0

Inno Setup 只允许在 [Files] [Dirs] 和 [Registry] 部分中设置权限,您必须以某种方式使用它们。这里有2个解决这个问题的方法。两者都很好,但每个都有轻微的缺点。

解决方案#1:设置整个目录的权限

[Dirs]
Name: {commonappdata}\MyCompany; Permissions:everyone-modify

[INI]
Filename: {commonappdata}\MyCompany\MyProg.ini; Section: "SomeSection"; Key: "SomeKey"; String: "SomeValue"

如果您不介意修改整个目录的权限,这是一个很好的解决方案。我确实介意并想出了第二个解决方案。

解决方案 #2:在 {tmp} 中创建您的 .ini 文件并将其复制到 [Files] 部分:

#define TargetIniDir "{commonappdata}\MyCompany"
#define TargetIniName "MyProg.ini"
....

[Files]
Source: {tmp}\{#TargetIniName}; DestDir: {#TargetIniDir}; Flags:external; Permissions: users-modify;

....

[Code]
procedure PrepareIniFileForCopy(section, key, value, iniFileTemp, iniFileTarget:String);
begin
    if FileExists(iniFileTarget) then 
      FileCopy(iniFileTarget, iniFileTemp, False);

    SetIniString(section, key, value,  iniFileTemp);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  iniFile, iniFileTemp:String;
begin
  if CurStep=ssInstall then begin
    PrepareIniFileForCopy('SomeSection', 'SomeKey', 'SomeValue', ExpandConstant('{tmp}\{#TargetIniName}'), ExpandConstant('{#TargetIniDir}\{#TargetIniName}'));

  end;
end;

这将在 {tmp} 目录中创建您的 .ini 文件(安装完成后将被删除),然后在 [Files] 部分复制到所需权限的所需commondata目录。请注意 [Files] 部分中的外部标志,这意味着该文件不会在编译时打包到设置中,而是在安装时动态获取。另请注意,必须在安装之前创建临时文件(CurStep=ssInstall 意味着在安装之前)。

我认为这个解决方案很好,但不是很漂亮。您将操作拆分到两个不同的地方,这依赖于一个在另一个之前完成。

这两种解决方案都可以为现有的 .ini 文件添加值,而不仅仅是创建新文件。

于 2014-08-08T16:30:05.480 回答