2013-11-27 7 views
6

フォルダをインストールした後に関数を呼び出そうとしましたが、InstallEnv関数が複数回呼び出されているようです。これらのファイルをすべてインストールした後で一度だけ呼び出す方法はありますか? Runセクションを使用することはできません。戻りコードでエラーをキャッチしたいからです。Inno Setup各ファイルにAfterInstall関数が呼び出されました

Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}/virtualenv"; \ 
    Flags: recursesubdirs; AfterInstall: InstallEnv; 
+1

両方の質問を見ると、必要なものを['CurStepChanged'](http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents&anchor=CurStepChanged)イベントで実行したくないのですか? 'CurStep'パラメタが' ssPostInstall'になったら? – TLama

+0

私は実際に月曜日にそれを試みましたが、実行がゼロ以外のコードを返した場合、インストールを失敗(または中止)したいと思っています。しかし、 'WizardForm.Close;'コードは 'ssPostInstall'では動作しません(実際のインストールの後である可能性があります)。 – Amaranth

+1

私は参照してください。 'InstallEnv'プロシージャの中の何かがうまくいかない場合、インストールプロセスを中止する方法(およびロールバックの変更)を探しています。まあ、最後にインストールされたファイルの名前には依存しません。何とか予測できないと感じるからです。別のオプションは、次にインストールされる '[Files]'エントリの 'BeforeInstall'手続きを書くかもしれません。あるいは、 'InstallEnv'プロシージャのためのパスカウンタを作成し、ファイルの総数をプリプロセッサで決定してください。プロシージャが呼び出されるたびにそのカウンタをインクリメントし、その定数値に達すると最後のファイルになります。 – TLama

答えて

3

はい、各ファイルごとに1回実行されます。 referenceは(私が強調した)それについてこう述べています。ワイルドカードを使用して

A BeforeInstallまたは[ファイル]セクションのエントリ ためAfterInstall機能ワイルドカードに一致するファイルごとに一度と呼ばれています。ファンクションが呼び出されるファイルを確認するには、 CurrentFileNameを使用します。

いいえ、すべてのファイルをインストールした後は一度も呼び出すことはできません。フラグ変数を宣言して、関数がすでに呼び出されているが、最後の呼び出しであるかどうかを検出したい場合は、フラグ変数を宣言する可能性があるため、一度だけ実行すると問題はありません。回避策はありません。

もしあなたが知っているのであれば、そのファイルから最新のものがインストールされていることを知っていれば、CurrentFileNameファンクションコールの結果と照合するかもしれませんが、最後にインストールされるものコンパイル時には(実行時に現在、インストールするファイルのリストを取得する方法がないため)。

5

1つのエントリ内から、そのファイルグループのインストールの最後にファイルを呼び出す方法はありません。しかし、ダミーのエントリを使用することによって、適切な時に関数を呼び出すことが可能である:

[Files] 
Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}\virtualenv"; Flags: recursesubdirs 
Source: dummy.txt; DestDir: {tmp}; AfterInstall: InstallEnv 

Sourceファイルが存在している必要がありますが、それは0バイトのファイルにすることができます。インストールは{tmp}にありますので、インストール後に削除されますので、内容は関係ありません。

[Files]のエントリが指定された順序でインストールされているためです。

関連する問題