2013-03-26 38 views
14

Tôi đang cố định cấu hình cài đặt Inno cho phần mềm của mình (đây là phần mềm c ​​#). Tôi dự định phát hành nhiều phiên bản phần mềm của mình, tôi muốn thay đổi giao diện cài đặt bộ cài đặt inno nếu phiên bản cũ hơn của ứng dụng của tôi đã được cài đặt trên máy tính. Trong trường hợp này, người dùng không thể thay đổi thư mục cài đặt.Tạo trình cài đặt sẽ thực hiện cập nhật nếu phiên bản cũ hơn đã được cài đặt

Có bốn trường hợp:

Trường hợp đầu tiên: đây là quá trình cài đặt đầu tiên của sản phẩm của tôi, thiết lập INNO nên tiến hành bình thường.

Trường hợp thứ hai: sản phẩm được cài đặt sẵn và bộ cài đặt chứa phiên bản mới hơn. Người dùng không thể chọn thư mục đích. Anh ta chỉ có thể chạy bản cập nhật.

Trường hợp thứ ba: Nếu trình cài đặt chứa phiên bản cũ hơn phiên bản đã cài đặt, bản cập nhật sẽ bị tắt và thông báo sẽ được hiển thị.

Trường hợp thứ tư: Phiên bản trình cài đặt giống với phiên bản đã cài đặt. Người dùng có thể sửa chữa phiên bản actuel của mình nếu cần.

Có thể thực hiện điều đó với InnoSetup không?

Trả lời

6

Thiết lập Inno đã xử lý các trường hợp 1, 2 và 4 tự động nếu số AppID của bạn được giữ nguyên cho tuổi thọ của ứng dụng.
Bạn cũng có thể ẩn các thư mục và nhóm các trang bằng cách sử dụng [Setup] chỉ thị sau:

DisableDirPage=auto 
DisableGroupPage=auto 

Xem ISXKB article này để biết thêm chi tiết.

Đối với trường hợp 3, giả sử tệp của bạn được phiên bản chính xác, Inno sẽ không hạ cấp bất kỳ điều gì, nhưng nó sẽ không thực sự cảnh báo người dùng. Để làm điều đó, bạn sẽ cần phải thêm mã để kiểm tra điều này, rất có thể trong hàm sự kiện InitializeSetup().

+2

Thực tế nếu bạn sử dụng Trình hướng dẫn tập lệnh để tạo tập lệnh thì mặc định cho tệp ứng dụng là thêm cờ 'bỏ qua', trong trường hợp đó, hạ cấp sẽ thực sự hạ cấp tất cả các tệp. Có thể bạn nên thêm thông báo cảnh báo để xác nhận rằng người dùng thực sự muốn làm điều đó, nhưng nếu không nó sẽ hoạt động tốt - giả sử rằng bản thân ứng dụng của bạn có thể đối phó với việc bị hạ cấp (ví dụ: mối quan tâm tương thích dữ liệu). Nếu không, bạn nên thêm lỗi thay vì cảnh báo. – Miral

+1

@Miral Tôi không nhận thấy điều đó. Cảm ơn cho những người đứng đầu lên. – Deanna

+0

Ví dụ logic để kiểm tra trong 'InitializeSetup' sẽ là tuyệt vời ... Tôi giả định có một số định nghĩa đã được nướng vào inno cho điều này ... – Assimilater

8

Nếu bạn muốn có một số phản hồi cho người dùng, bạn có thể thử một cái gì đó như thế. Trước hết, bản cập nhật của bạn phải có cùng tên AppId làm Ứng dụng chính của bạn. Sau đó, bạn có thể đặt một số kiểm tra, sẽ hiển thị thông báo để thông báo cho người dùng về trạng thái.

#define MyAppVersion "1.2.2.7570" 
#define MyAppName "MyApp Update" 

[Setup] 
AppId=MyApp 
AppName={#MyAppName} 
AppVersion={#MyAppVersion} 
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1,InstallLocation} 
DisableDirPage=True 

[CustomMessages] 
MyAppOld=The Setup detected application version 
MyAppRequired=The installation of {#MyAppName} requires MyApp to be installed.%nInstall MyApp before installing this update.%n%n 
MyAppTerminated=The setup of update will be terminated. 

[Code] 
var 
InstallLocation: String; 

function GetInstallString(): String; 
var 
InstPath: String; 
InstallString: String; 
begin 
InstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1'); 
InstallString := ''; 
if not RegQueryStringValue(HKLM, InstPath, 'InstallLocation', InstallString) then 
RegQueryStringValue(HKCU, InstPath, 'InstallLocation', InstallString); 
Result := InstallString; 
InstallLocation := InstallString; 
end; 

function InitializeSetup: Boolean; 
var 
V: Integer; 
sUnInstallString: String; 
Version: String; 
begin 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'UninstallString') then begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'DisplayVersion', Version); 
     if Version =< ExpandConstant('{#MyAppVersion}') then begin 
      Result := True; 
      GetInstallString(); 
     end 
     else begin 
MsgBox(ExpandConstant('{cm:MyAppOld}'+Version+'.'+#13#10#13#10+'{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
     Result := False; 
    end; 
end 
else begin 
    MsgBox(ExpandConstant('{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
    Result := False; 
end; 
end; 
+0

của riêng tôi 1. Kiểm tra xem ứng dụng đã được cài đặt hay chưa; 2. Kiểm tra phiên bản ứng dụng; 3. So sánh phiên bản ứng dụng để cập nhật phiên bản; 3a. nếu cập nhật mới hơn thì cài đặt; 3b. nếu cập nhật cũ hơn thì không cài đặt; 3c.nếu ứng dụng không có thì không cài đặt – RobeN

+0

Inno đã tự động nhớ thư mục cài đặt, hiển thị mã 'DefaultDirName' của bạn dự phòng. Bạn cũng không chỉ định mặc định cho lần cài đặt đầu tiên. – Deanna

+0

Đây chỉ là Mã cập nhật, không phải là Ứng dụng cơ sở ... – RobeN

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