[英]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.