1

シナリオは、Inno Setup 中に呼び出してその出力を読み取るコンソール アプリケーションを作成したことです。この問題とは対照的に、他のプログラムがまだ実行されている間に Inno Setup からこの出力を読み取る必要があります。出力には、ProgressGauge を使用して Inno に表示する、実行中のアプリケーションの進行状況情報 (double または int 値) が含まれます。このアプリは、C# で記述された単純な実行可能ファイルであり、数秒から数分で実行できます。

これは可能ですか?可能であれば、Inno Setup の GUI をフリーズせずに実行できますか (アプリケーションに時間がかかるため)?

4

1 に答える 1

3

を指しているTLamaでprogress bar messages、問題を解決できました。

最初に、進行状況バーのハンドルを Inno から C# アプリに渡す必要がありました。このために、int ポインターを文字列として返す関数を作成しました。

function GetProgressHandle(Param: String): String;
begin
  Result := Format('%d',[WizardForm.ProgressGauge.Handle]);
end;

アプリを呼び出すときに Run セクションで使用します。

[Run]
Filename: "{app}\myApp.exe"; Parameters: "{code:GetProgressHandle}"; ....

C# では、コンソール引数から int ポインターを読み取り、それを使用してIntPtr:

IntPtr pointer = new IntPtr(Int32.Parse(args[0]));

メッセージをプログレス バーに送信するために、user32.dll をインポートし、通常は commctrl.h にある必要な定数を再定義しました。

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public const uint PBM_SETRANGE = 0x401;
public const uint PBM_SETPOS = 0x402;

最後に、プログレス バーの範囲を 0 から最大まで設定し、特定の位置pos

PostMessage(pointer, PBM_SETRANGE, (IntPtr)0, (IntPtr)(max << 16));    
PostMessage(pointer, PBM_SETPOS, (IntPtr)pos, (IntPtr)0);

: プログレス バーの位置を変更しても、Inno セットアップ ウィンドウがすぐに更新されないようです。500ミリ秒ごとに位置を増やしてテストしましたが、顕著な違いがありました(一時停止は約0.2〜0.8ミリ秒の範囲でした)。私の場合、プログレス バーの変更が正確なタイミングで行われることは重要ではありませんが、これが必要な人のために、Inno Setup ウィンドウを同様の方法で (特定のハンドルと異なるメッセージ定数を使用して) 更新できると想定しています。

于 2013-09-13T16:56:25.510 に答える