2

フォルダーにファイルを作成する場合は、パラメーターを 1行{commonappdata}に追加する必要があります。Permissions:users-modify[Files] Source:...

これはうまく機能します(インストールされたプログラム内からインストールされたファイルの1つを変更するときに、ローミングフォルダーが使用されていないことを確認する方法を最終的に見つけました)。

しかし、このセクションのINI エントリをPC 上のすべてのユーザーが書き込めるようにするにはどうすればよいでしょうか? 結局のところ、ユーザーの価値ではなく、プログラムの価値があります。[INI] Filename:...

現在、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] セクションのみが「Permissions」パラメーターを許可します。そのため、[Ini] セクションで権限を変更した ini ファイルを作成することはできません。タスクを達成する 1 つの方法は、「ini」セクションを使用してセットアップ中に必要な情報を収集し、インストール後のアクションとして、「files」セクションで作成された変更された権限を持つファイルに 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番目の解決策を思いつきました。

解決策 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 ファイルに値を追加できます。

于 2014-08-08T16:30:05.480 に答える