我正在使用Inno Setup為我的應用程序創建安裝程序.安裝程序非常基本,只是復制一些文件.這非常有效,我很滿意.
我最近實現了USB支持,需要從IVI基礎安裝USB驅動程序.它基本上是一個exe文件,必須在安裝過程中的某個地方啟動.到目前為止,用戶必須單獨安裝驅動程序,這不是那么優雅.我的第一個方法是:
1 [Run] 2 Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; Description: "Install USB driver (IVI Foundation)"; Flags: postinstall skipifsilent 3 Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; Description: "Install 64bit USB driver (IVI Foundation)"; Flags: postinstall skipifsilent 4 Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName,"&","&&")}}"; Flags: postinstall skipifsilent
這樣可行,但用戶必須選擇正確的位數.這里的優點是他可以選擇不安裝它(在這種情況下,應用程序只是忽略USB功能,這很好).我真正想要的是自動檢測系統的位數並運行設置過程.這不必在[Run]部分,雖然我沒有任何反對它(因為用戶可以選擇不安裝它).
我還找到了一些代碼並試圖像這樣運行它:
1 de] 2 procedure CurStepChanged (CurStep: TSetupStep); 3 var
4 WorkingDir: String; 5 ReturnCode: Integer; 6 begin 7 if (ssInstall = CurStep) then 8 Log('Starting driver installation'); 9 WorkingDir := ExpandConstant ('{app}\driver'); 10 Exec ('IviSharedComponents_2.2.1.exe','',WorkingDir,SW_SHOW,ewWaitUntilTerminated,ReturnCode); 11 end;
但這不會啟動安裝(雖然我可以看到日志條目’啟動驅動程序安裝’).我的道路有問題嗎?我做錯了什么?如何更改此腳本以根據位數自動選擇正確的可執行文件?
編輯:我在[任務]條目中使用了建議的解決方案.實現看起來像這樣(僅供參考):
1 [Tasks] 2 Name: "install_usb"; Description: "Install USB drivers (IVI Foundation)"; GroupDescription: "External drivers:"; 3
4 [Run] 5 Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Tasks: install_usb; Flags: skipifsilent 6 Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Tasks: install_usb; Flags: skipifsilent
這非常有效,非常感謝您的幫助!
解決方法
在這種情況下,最好刪除postinstall標志,使其在設置過程結束時(但在完成之前)無條件運行,並添加Check:參數以將其限制為正確的位數:
1 [Run] 2 Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Flags: skipifsilent 3 Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Flags: skipifsilent
如果您希望這是有條件的,您可以使用在安裝開始之前提示的正常[任務]條目.