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番目の解決策を思いつきました。
解決策 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 はインストールの直前を意味します)。
この解決策は良いと思いますが、あまりきれいではありません。操作を 2 つの異なる場所に分割し、一方が他方より先に実行されることに依存します。
どちらのソリューションも、新しいファイルを作成するだけでなく、既存の .ini ファイルに値を追加できます。