簡體   English   中英

從Inno Setup中運行的命令行應用程序獲取輸出

[英]Getting output from running command line app in Inno Setup

場景是我們編寫了一個控制台應用程序,希望在Inno Setup期間調用它並讀取其輸出。 相對於此問題 ,有必要在其他程序仍在運行時從Inno Setup讀取此輸出。 輸出將包含我們要使用ProgressGauge在Inno中顯示的runnig應用程序的進度信息(雙精度或整數值)。 該應用程序是用C#編寫的簡單可執行文件,可以運行幾秒鍾到幾分鍾。

這是否可能,如果可以,是否可以在不凍結Inno Setup的GUI的情況下完成(因為該應用程序可能需要一些時間)?

通過TLama指向progress bar messages我能夠解決問題。

首先,我需要將進度條句柄從Inno傳遞到C#應用程序。 為此,我創建了一個函數,該函數會將int指針作為字符串返回給我

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

並在調用我的應用程序時在“運行”部分中使用它:

[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 Setup窗口。 我通過每500毫秒增加一次位置來測試它,但是在那兒有明顯的差異(暫停在0.2到0.8毫秒范圍內更大)。 就我而言,准確地更改進度條的時間並不重要,但我認為可以為需要此操作的人以類似的方式(使用特定的句柄和不同的消息常量)來更新Inno Setup窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM