3

「すべてのユーザーにインストール」と「自分だけにインストール」のどちらかをユーザーに選択させるアプリ用の Inno Setup インストーラーがあります。すべてのユーザーにインストールする場合、INI ファイルは commonappdata に配置され、設定が共有されます (これはお客様の要件です)。現在のユーザー用にインストールされている場合は、ローカル設定 appdata に配置されます。

アプリがインストールされたら、アプリが実行時にどのインストール オプションが使用されたかを「認識」し、INI ファイルをどこから読み取って保存するかをアプリが最も明確に知る方法は何ですか? また、「デフォルト」フォルダー (ユーザーが最初にデータ ファイルを開こうとしたときに配置されるフォルダー) を、シングル ユーザー インストールの場合は MyDocs に、すべてのユーザー インストールの場合は SharedDocs にしたいと思います。ソリューションはそのためにも機能します。

4

1 に答える 1

1

「自分用にインストール」が選択されている場合、セットアップで HKCU の下にレジストリ値を書き込みます。プログラムの起動時にキーを照会し、それに応じて既定のフォルダーを決定します。

タスクを使用してユーザーにインストールの種類を選択させる場合は、次のようなレジストリ エントリを使用できます。

[Registry]
Root: HKCU; SubKey: SOFTWARE\MyCompany\MyProg; ValueType: dword; ValueName: InstallUserOnly; ValueData: 1; Tasks: install_just_for_me; Flags: UninsDeleteValue; 

次に、アプリケーションの起動時に次のようなことができます。

function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string;
begin
  SetLength(Result, MAX_PATH + 1);
  SHGetSpecialFolderPath(0, PChar(Result), FOLDER, CanCreate);
  Result := PChar(Result);
end;

...
var
  Reg: TRegistry;
  DefFolder: string;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\SOFTWARE\MyCompany\MyProg', False) then begin
      if Reg.ValueExists('InstallUserOnly') then
        DefFolder := GetSpecialFolderPath(CSIDL_PERSONAL, True)
      else
        DefFolder := GetSpecialFolderPath(CSIDL_COMMON_DOCUMENTS, True);
    end;
  finally
    Reg.Free;
  end;

もちろん、必要に応じてレジストリ値を読み取ることもできます。

于 2011-04-20T20:50:18.607 に答える