4

TL; DRバージョン:

InnoSetupスクリプトで、使用中のファイルが原因で再起動が必要かどうかをどのように検出できますか?

より詳細なバージョン:

次の特徴を持つInnoSetupスクリプトがあります。

  • このShouldSkipPage関数は、ウェルカムページのカスタム[詳細オプション]チェックボックスがオンになっていない限り、すべてのページ(ウェルカムページを除く)がスキップされるように実装されています。

    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
        if ((PageID = wpSelectDir) or
            (PageID = wpSelectProgramGroup) or
            (PageID = wpSelectTasks) or
            (PageID = wpFinished) or
            (PageID = wpReady)) then
        begin
            Result := not advancedCheckBox.Checked;
        end;
    end;
    
  • CloseApplicationsおよびは(*)にRestartApplications設定されており、一部のファイルにはとフラグが付いているため、ファイルが使用されていた場合は、インストールを完了するために再起動が必要になります。falserestartreplaceuninsrestartdelete

ここで、再起動が必要な場合は、ユーザーにプロンプ​​トを表示せずに再起動させたくないため、[詳細オプション]チェックボックスの状態に関係なく[完了]ページを表示したいと思います。したがって、私のコードは次のようになります。

    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
        if ((PageID = wpSelectDir) or
            (PageID = wpSelectProgramGroup) or
            (PageID = wpSelectTasks) or
            (PageID = wpReady)) then
        begin
            Result := not advancedCheckBox.Checked;
        end
        else if ((PageID = wpFinished)) then
        begin
            Result := (not advancedCheckBox.Checked) and (not IsRestartNeeded);
        end
    end;

残念ながら、IsRestartNeeded関数はありません(NeedRestart存在しますが、イベント関数です)。ドキュメントを長い間見てきましたが、この情報を提供できる関数は見つかりませんでした。

私が考えることができる唯一のオプションHKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperationsは、ファイルに私のファイルが含まれているかどうかを確認することですが、それはかなり醜い解決策です...


(*)置き換えまたは削除したいファイルは、シェル拡張機能と、この拡張機能で使用されるいくつかのDLLです。リスタートマネージャーに依存していない理由は、リスタートマネージャーが機能していないように見えるためですexplorer.exe。プロセスはすぐに再起動され、ファイルは再びロックされます。

4

1 に答える 1

4

通常の推奨事項はMakePendingFileRenameOperationsChecksum、インストール プロセスの開始近くに電話することです。その後、再起動が必要かどうかを確認したい場合はいつでも電話してください。同じ値を返し続ける限り、再起動は必要ありません。

これは「強制再起動」を考慮しないことに注意してください。trueを実装NeedRestartして返すか、restartフラグでマークされたコンポーネントから。あなたはそれをコントロールしているので、あなたは自分でそれを理解できると期待されています.

于 2012-11-15T06:24:30.043 に答える