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 文件添加值,而不仅仅是创建新文件。