10

次の行があります。

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

チェックボックスを表示せずにアプリを開始したいと思います(ユーザーがそうすることができなくなります)。

誰か教えてくれませんか?ありがとうございました。

4

2 に答える 2

18

私が考えることができるいくつかのオプションがあります。1 つ目は、スクリプトのセクションからアプリケーションを実行することです[Code]。2 つ目は、セクション エントリのチェック ボックスを無効にすることです[Run]。3 つ目は、RunList.

1. ウィザードの終了時にアプリケーションを手動で実行する方法は?

チェックボックスを追加して後で非表示にするよりも簡単なので、個人的にはこの方法を好みます。[Run]現在のセクション エントリを削除し、NextButtonClickイベント メソッドから次の関数のいずれかを呼び出します。これは、そのパラメーターが[終了] ボタンのクリックを示す にCurPageID等しい場合です。wpFinished

  • Exec- セットアップ/アンインストールと同じ資格情報を使用して、指定された実行可能ファイルまたはバッチ ファイルを実行します。
  • ExecAsOriginalUser- 最初にセットアップを開始したユーザーの (通常は昇格されていない) 資格情報を使用して、指定された実行可能ファイルまたはバッチ ファイルを実行します。
  • ShellExec- セットアップ/アンインストールと同じ資格情報を使用して、指定されたファイルを開くか、Verb で指定された別のアクションを実行します。
  • ShellExecAsOriginalUser- 最初にセットアップを開始したユーザーの (通常は昇格されていない) 資格情報を使用して、指定されたファイルを開くか、Verb で指定された別のアクションを実行します。

runascurrentusernorフラグを使用していないためshellexec、セットアップは内部的に次のような関数を呼び出します。

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  if CurPageID = wpFinished then
    ExecAsOriginalUser(ExpandConstant('{app}\MyApp.exe'), '', '', 
      SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

このソリューションの弱点の 1 つは、セットアップによって再起動が要求された場合でも、プログラムが実行されることです。この要求を判断するための欠落している可能性を回避するには、YesRadioが表示されているかどうか ([はい、今すぐコンピューターを再起動します] ラジオ ボタン) が選択されているかどうかを確認します。これは、ユーザーがコンピューターを再起動するように求められ、それを確認したことを意味します。再起動要求を考慮したバージョンは次のとおりです。

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  // if the "Finish" button was clicked and "Yes, restart the computer now"
  // radio button was either not visible or not selected that time, then...
  if (CurPageID = wpFinished) and ((not WizardForm.YesRadio.Visible) or 
    (not WizardForm.YesRadio.Checked))
  then
    ExecAsOriginalUser(ExpandConstant('{app}\MyApp.exe'), '', '', 
      SW_SHOWNORMAL, ewNoWait, ResultCode);
end;

2. 最終ページのインストール後のチェックボックスを無効にする方法は?

もう 1 つのオプションは、チェック ボックスを無効にすることです。ユーザーは、アプリケーションが実行されることを確認できますが、それに対して何もすることはできません (もちろん、タスク マネージャーからセットアップを強制終了する以外は)。今回は、[Run]セクション エントリをそのままにしますが、セクションRunListから次のように変更します。[Code]

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

[Files]
Source: "MyApp.exe"; DestDir: "{app}"

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
  // you must do this as late as possible, because the RunList is being modified
  // after installation; so this will check if there's at least one item in the
  // RunList and then set to the first item (indexing starts at 0) Enabled state
  // to False
  if (CurPageID = wpFinished) and (WizardForm.RunList.Items.Count > 0) then
    WizardForm.RunList.ItemEnabled[0] := False;
end;

3. RunList を完全に非表示にする方法は?

これは、2 番目のオプションとは対照的に、要求したことを実行します。チェックボックスを非表示のままにするか、より正確には、全体を非表示にするため、フラグが指定されたセクションにRunList複数のエントリがある場合、それも表示されません。[Run]postinstall

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

[Files]
Source: "MyApp.exe"; DestDir: "{app}"

[Run]
Filename: "{app}\MyApp.exe"; Flags: postinstall nowait

[Code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpFinished then
    WizardForm.RunList.Visible := False;
end;
于 2013-09-22T09:56:09.187 に答える