2012-07-10 49 views
6

Tôi đang sử dụng Cài đặt Inno để tạo trình cài đặt cho ứng dụng của mình. Trình cài đặt rất cơ bản và chỉ sao chép một số tệp. Điều này hoạt động rất tốt và tôi hài lòng với nó.Cài đặt Inno Setup có thể chạy được (cài đặt trình điều khiển) trong khi cài đặt

Gần đây, tôi đã triển khai hỗ trợ USB và cần cài đặt trình điều khiển USB từ nền tảng IVI cho điều đó. Nó về cơ bản là một tập tin exe mà phải được đưa ra một nơi nào đó trong quá trình thiết lập. Cho đến bây giờ, người dùng phải cài đặt các trình điều khiển riêng biệt, điều đó không quá thanh lịch. Cách tiếp cận đầu tiên của tôi là:

[Run] 
Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; Description: "Install USB driver (IVI Foundation)"; Flags: postinstall skipifsilent 
Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; Description: "Install 64bit USB driver (IVI Foundation)"; Flags: postinstall skipifsilent 
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: postinstall skipifsilent 

Công trình này, nhưng người dùng phải chọn độ chính xác. Ưu điểm ở đây là anh ta có thể chọn không cài đặt nó (trong trường hợp đó ứng dụng chỉ bỏ qua chức năng USB là tốt). Những gì tôi thực sự muốn là để phát hiện bitness của hệ thống tự động và chạy quá trình thiết lập. Điều này không có trong phần [Run], mặc dù tôi sẽ không có bất kỳ điều gì chống lại nó (vì người dùng có thể chọn không cài đặt nó).

Tôi cũng tìm thấy một số mã và cố gắng chạy nó như thế này:

[Code] 
procedure CurStepChanged (CurStep: TSetupStep); 
var 
    WorkingDir: String; 
    ReturnCode: Integer; 
begin  
    if (ssInstall = CurStep) then 
    Log('Starting driver installation'); 
    WorkingDir := ExpandConstant ('{app}\driver'); 
    Exec ('IviSharedComponents_2.2.1.exe', '', WorkingDir, SW_SHOW, ewWaitUntilTerminated, ReturnCode); 
end; 

Nhưng điều này không bắt đầu quá trình cài đặt (mặc dù tôi có thể thấy mục log 'Bắt ​​đầu cài đặt driver'). Có điều gì sai trái với con đường của tôi không? Tôi đang làm gì sai và làm thế nào tôi có thể thay đổi kịch bản này để tự động chọn đúng thực thi tùy thuộc vào bitness?

EDIT: Tôi đã sử dụng giải pháp được đề xuất với mục nhập [Tasks]. Việc triển khai giống như thế này (chỉ để tham khảo):

[Tasks] 
Name: "install_usb"; Description: "Install USB drivers (IVI Foundation)"; GroupDescription: "External drivers:"; 

[Run] 
Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Tasks: install_usb; Flags: skipifsilent 
Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Tasks: install_usb; Flags: skipifsilent 

Điều này hoạt động rất tốt, cảm ơn rất nhiều sự giúp đỡ của bạn!

Trả lời

8

Trong trường hợp này, tốt nhất là để loại bỏ các lá cờ postinstall để nó chạy vô điều kiện vào cuối của quá trình cài đặt (nhưng trước khi nó nói xong) và thêm một tham số Check: để hạn chế nó vào bitness đúng:

[Run] 
Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Flags: skipifsilent 
Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Flags: skipifsilent 

Nếu bạn muốn điều này có điều kiện, bạn có thể sử dụng mục nhập [Tasks] bình thường sẽ nhắc trước khi bắt đầu thiết lập.

+0

Rất tốt, cảm ơn rất nhiều, đó là chính xác những gì tôi muốn! :) – brimborium

+1

Tôi cũng đã thêm giải pháp cuối cùng của mình (với mục nhập 'Tasks ') ở cuối câu hỏi của mình. – brimborium

+0

Thx, lỗi chính tả. ;) – brimborium

Các vấn đề liên quan