2009-02-26 16 views
6

長いExecは、.NET 3.5をインストールして、アウトスクリプトは、このいずれかをオフに基づいています: http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/長いExecを実行しているときにInno Setupが凍結しないようにするにはどうすればよいですか?

問題は、我々は終了コードをキャプチャする必要があるので、それは「ewWaitUntilTerminated」を使っているということです。私たちが/ passive/norestartを実行しているので、ユーザーの作業が少なくて済むようになっています(たぶん、そうすべきではないでしょうか?)

私が考えることのできる最も簡単な選択肢は、ウィンドウが開いている間に.NETをインストールしてからもう一度表示していますが、その方法はわかりません。

理想的な解決策は進行状況ページを表示することですが、すぐに復帰する必要がありますが、プロセスが終了して終了コードを取得したときに何らかの形で通知されるため、そうでなければ、永遠のプログレスバーがあります。

これについてどうやったらいいですか?

編集:最小化するほうが良いかもしれませんが、その方法もわかりません。プロセスに10〜20分かかることがあるというメッセージが表示されますが、メインセットアップフォームが完全にフリーズしている、移動できない、最小化している、または何らかの操作が行われていないという問題があります。また、.NETインストーラは、遅いマシンでは1分または2分の進捗状況を表示しません。

+0

はちょうどそれが最初の必須の再起動後まで、.NET 3.5を望むことを私に警告することから始めませんでしたアプリのデモをインストール午後を過ごした...ユーザーが予期しない長さ約厄介な得ることができることだけ言うことができますサブインストールしかし、技術的な答えはありません。 – RBerteig

+0

その後、.NETはまた再起動が必要でした。その後、元のアプリケーションのセットアップは実行中であることを忘れていたので、実際には一時フォルダで手動で見つけて再実行してアプリケーションを実際にインストールする必要がありました。 – RBerteig

+0

ええ、フレームワークがインストールされる前にそのユーザーに通知してキャンセルさせ、.netインストーラの再起動を抑制し、リターンコードでキャプチャして再起動します – Davy8

答えて

0

我々はカップルの製品と.NETをインストールするために必要なてきた、と二つのアプローチ取っている:Innosetupと.NETをインストールするとき

  • を、我々は、ユーザーがインストールに時間がかかるだろうことを知ってみましょうそれが完了したときに特定のメッセージが表示されるようにすることをお勧めします。
  • .NETを起動して、クライアントを強制的に強制するフラグを設定しません。彼らは、より技術的に傾斜している場合、彼らがインストール我々は、正直なところ、特に今より多くのシステム管理者がロックダウンするように見えること、第二オプションを指定して、より良い運を持っていた

ので、時間がかかっている理由を知っているこの方法は、特定のデスクトップ度。

+0

ええ、私たちは現在、最初のアプローチを使用しており、2番目のアプローチを検討していますが、より良い解決策があるかどうか疑問に思っています。 – Davy8

2

おそらく簡単ですが、.Netインストーラを実行している間はインストーラを隠すことはお勧めしません。私は他のインストーラがそれをするのを見たことがあり、それが起こると、インストールが完了したと思うし、本当にそうでないことが分かったら混乱します。 (インストールが本当に終わったときには、もう一度隠しておいてもかまいません)

Inno Setupウィザードでカスタムページを表示できます。このようなページをプログレスバーに表示して正確に表示することはおそらく難しいだろうが、少なくともウィザードのページに、インストーラが.Netインストーラを待っていることを示すメッセージを表示することができます。ヘルプファイルの「カスタムウィザードページの使用」を参照してください。

+0

しかし、 Execは同じスレッドで実行されているため、ユーザーは設定フォームを移動、サイズ変更、最小化、または何もできません。 – Davy8

+0

(私は個人的には大丈夫だと思っていましたが、私の上司はそれに不満を持ち、容認できないと主張しました) – Davy8

+1

@ Davy8:最初のコメントは完全に真実ではありません - 同じスレッドで実行されていますが、Application.ProcessMessagesただし、ウィザードフォームは無効になっているため、移動、サイズ変更などはできません。 – mghie

2

あなたは、単に私はこれは本当にきれいではないことに同意しても

WizardForm.Hide; 
Exec(...); 
WizardForm.Show; 

を呼び出すことにより、インストーラウィザードのフォームを非表示にすることができます。

0

質問をしてから5年経ちましたが、とにかく私の答えはここにあります。Execの()あなたはこのようにメインのプログレスバーの上Inno Setupので表示されるメッセージを設定することができます呼び出す前に

:「凍結見ていない」Innosetup作るの

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...'; 
+0

[マーキープログレスバーを表示]/20753218/960757)。また、 'StatusLabel'のキャプションを保存し、変更するときにそれを元に戻す必要があります。 – TLama

7

一つの方法は、追加することです何かが起こっていることを示すためにマーキーのような "偽の"進捗インジケータ。しかし、これは "ウィンドウドラッグ/移動"問題を解決しません。

長い実行中のプロセスが実行されている間ので、別の方法は、本当にInnosetup GUIをアンフリーズすることです:

「長時間実行されるプロセス」)(ShellExecuteExを介して実行されます。 は、インストーラは、条件 WaitForSingleObjectAppProcessMessageを実行するための非常に最小限のタイムアウト とwhileループを使用します。

AppProcessMessage自体がヘルパー機能です。 WinAPI関数PeekMessage()TranslateMessage()およびDispatchMessage()を使用して、 "汎用"コードを使用して "Application.ProcessMessages" -ishプロシージャを再作成します。 その仕事はInnoSetup GUIへのメッセージポンプです。 「長時間実行されるプロセスは、」バックグラウンドで処理されている間

このトリックは、再び をウィンドウ応答/ドラッグ可能になります。

これは、実行ループのソースである:

if ShellExecuteEx(ExecInfo) then 
    begin 
    while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT 
    do begin 
     AppProcessMessage; 
     WizardForm.Refresh(); 
    end; 
    CloseHandle(ExecInfo.hProcess); 
    end; 

unzip.issための以下のGISTはAppProcessMessage機能を操作するためのビットと作品を含むスタンドアロンUnzip Helper for executing 7zip without blocking the InnoSetup GUIためのコードを含んでいます。この場合、「解凍」で

は一例であり、あなたは何でも、ネットインストーラまたはその他の長時間実行タスクで実行されるアプリケーションを置き換える可能性があります。

+1

これは正解です! – QbProg

+1

美しい、これはありがとう! – Iguananaut

関連する問題