当我们使用inno setup打包时,希望用户在卸载时能够弹出自定义窗口,并上传信息到服务器。
如图自定义窗口:
我希望用户填写描述信息和邮件,当点击Uninstall时开始上传数据。
注意:inno setup里换行符为**#13#10**,控件生成布局和卸载逻辑判断都是在InitializeUninstallProgressForm接口里,数据上传使用的是WinHttpRequest,
关于WinHttpRequest的使用
WinHttpReq.SetRequestHeader('Content-Type', 'multipart/form-data; boundary= abcd');
我上传用的是表单的形式,可传文件也可不传文件,其中boundary= abcd 'abcd’表示自定义的分隔符。上传的body数据开头必须以 --abcd表示开始,以–abcd–表示结束,
下面直接上代码,可直接拷贝代码,然后编译运行安装后,打开安装目录双击卸载程序看效果
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProgTest.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{937FF684-D2F1-4D0A-B71D-EF2D1DD8B6A4}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Program Files (x86)\Inno Setup 6\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Code]
var
UninstallFeedBackPage: TNewNotebookPage;
UninstallButton: TNewButton;
ComboBox: TNewComboBox;
ComboLabel: TNewStaticText;
Memo: TNewMemo;
Edit: TNewEdit;
ComboText, DiscripText, EmailText, MsgText: TNewStaticText;
procedure UninstallButtonClick(Sender: TObject);
var
WinHttpReq: Variant;
requestType: string;
discription: string;
email: string;
url,body: string;
begin
if Memo.Text <> '' then
begin
requestType := ComboBox.Text;
discription := Memo.Text;
email := Edit.Text;
url := 'http://xxx.com:8080/cgaga/api/shopify/file/feedback?' + 'problemType=' + requestType + '&content=' +discription + '&email=' + email;
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('POST', url, false);//第三个参数表示同步或异步上传
WinHttpReq.SetRequestHeader('Content-Type', 'multipart/form-data; boundary= abcd');
body := '--abcd' + #13#10;
body := body + 'Content-Disposition: form-data; name="file"; filename=""' + #13#10;
body := body + 'Content-Type:text/plain' + #13#10#13#10; //application/octet-stream
body := body + '' + #13#10;//因为没有传文件,所以这里是空字符串''
body := body + '--abcd--' + #13#10;
WinHttpReq.Send(body);
if WinHttpReq.Status <> 200 then
begin
MsgBox(WinHttpReq.ResponseText, mbError, MB_OK);
end
else
begin
MsgBox('SUCCESS', mbInformation, MB_OK);
end;
end;
UninstallButton.Visible := False;
ComboText.Visible := False;
ComboBox.Visible := False;
DiscripText.Visible := False;
Memo.Visible := False;
EmailText.Visible := False;
Edit.Visible := False;
MsgText.Visible := False;
end;
procedure InitializeUninstallProgressForm();
var
PageNameLabel: string;
PageDescriptionLabel: string;
CancelButtonEnabled: Boolean;
CancelButtonModalResult: Integer;
begin
if not UninstallSilent then
begin
{ Create the first page and make it active }
UninstallButton := TNewButton.Create(UninstallProgressForm);
UninstallButton.Parent := UninstallProgressForm;
UninstallButton.Left :=UninstallProgressForm.CancelButton.Left - UninstallProgressForm.CancelButton.Width - ScaleX(10);
UninstallButton.Top := UninstallProgressForm.CancelButton.Top;
UninstallButton.Width := UninstallProgressForm.CancelButton.Width;
UninstallButton.Height := UninstallProgressForm.CancelButton.Height;
UninstallButton.Caption := 'Uninstall';
UninstallButton.ModalResult := mrOK;
UninstallButton.OnClick := @UninstallButtonClick;
UninstallFeedBackPage := TNewNotebookPage.Create(UninstallProgressForm);
UninstallFeedBackPage.Notebook := UninstallProgressForm.InnerNotebook;
UninstallFeedBackPage.Parent := UninstallProgressForm.InnerNotebook;
UninstallFeedBackPage.Align := alClient;
ComboText := TNewStaticText.Create(UninstallProgressForm);
ComboText.Parent := UninstallFeedBackPage;
ComboText.Top := ScaleY(3);
ComboText.Left := UninstallProgressForm.StatusLabel.Left;
ComboText.Width := 72;
ComboText.AutoSize := False;
ComboText.ShowAccelChar := False;
ComboText.Caption := 'Request Type';
ComboBox := TNewComboBox.Create(UninstallProgressForm);
ComboBox.Parent := UninstallFeedBackPage;
ComboBox.Width := ScaleX(100);
ComboBox.Top := ScaleY(0);
ComboBox.Left := ComboText.Left + ComboText.Width + ScaleX(5);//UninstallProgressForm.StatusLabel.Left;
ComboBox.Style := csDropDownList;
ComboBox.Items.Add('Please select...');
ComboBox.Items.Add('Suggestion');
ComboBox.Items.Add('User experience');
ComboBox.Items.Add('Activate issue');
ComboBox.Items.Add('Report a bug');
ComboBox.Items.Add('Others');
ComboBox.ItemIndex := 0;
DiscripText := TNewStaticText.Create(UninstallProgressForm);
DiscripText.Parent := UninstallFeedBackPage;
DiscripText.Top := ComboBox.Top + ComboBox.Height + ScaleY(15);
DiscripText.Left := UninstallProgressForm.StatusLabel.Left;
DiscripText.Width := 100;
DiscripText.AutoSize := False;
DiscripText.ShowAccelChar := False;
DiscripText.Caption := 'Description';
Memo := TNewMemo.Create(UninstallProgressForm);
Memo.Parent := UninstallFeedBackPage;
Memo.Top := DiscripText.Top + DiscripText.Height + ScaleY(3);
Memo.Left := UninstallProgressForm.StatusLabel.Left;
Memo.Width := ScaleX(420);
Memo.Height := ScaleY(100);
Memo.Anchors := [akLeft, akTop, akRight, akBottom];
Memo.ScrollBars := ssVertical;
Memo.Text := '';
Memo.MaxLength := 1500;
EmailText := TNewStaticText.Create(UninstallProgressForm);
EmailText.Parent := UninstallFeedBackPage;
EmailText.Top := Memo.Top + Memo.Height + ScaleY(20);
EmailText.Left := UninstallProgressForm.StatusLabel.Left;
EmailText.Width := 100;
EmailText.AutoSize := False;
EmailText.ShowAccelChar := False;
EmailText.Caption := 'Email';
Edit := TNewEdit.Create(UninstallProgressForm);
Edit.Parent := UninstallFeedBackPage;
Edit.Top := EmailText.Top + EmailText.Height + ScaleY(3);
Edit.Left := UninstallProgressForm.StatusLabel.Left;
Edit.Width := UninstallFeedBackPage.Width div 2 + ScaleX(20);
MsgText := TNewStaticText.Create(UninstallProgressForm);
MsgText.Parent := UninstallFeedBackPage;
MsgText.Top := Edit.Top + Edit.Height + ScaleY(2);
MsgText.Left := UninstallProgressForm.StatusLabel.Left;
MsgText.Width := UninstallFeedBackPage.Width;
MsgText.AutoSize := False;
MsgText.ShowAccelChar := False;
MsgText.Font.Color := clGray;
MsgText.Caption := 'We will look into your feedback and get back to you if necessary.';
UninstallProgressForm.InnerNotebook.ActivePage := UninstallFeedBackPage;
PageNameLabel := UninstallProgressForm.PageNameLabel.Caption;
PageDescriptionLabel := UninstallProgressForm.PageDescriptionLabel.Caption;
UninstallProgressForm.CancelButton.TabOrder := UninstallButton.TabOrder + 1;
UninstallProgressForm.PageNameLabel.Caption := 'Cgaga Fotosifter';
UninstallProgressForm.PageDescriptionLabel.Caption :='You can describe your suggestion and the issue you encountered in detail';
{ Run our wizard pages }
CancelButtonEnabled := UninstallProgressForm.CancelButton.Enabled
UninstallProgressForm.CancelButton.Enabled := True;
CancelButtonModalResult := UninstallProgressForm.CancelButton.ModalResult;
UninstallProgressForm.CancelButton.ModalResult := mrCancel;
if UninstallProgressForm.ShowModal = mrCancel then Abort;
{ Restore the standard page payout }
UninstallProgressForm.CancelButton.Enabled := CancelButtonEnabled;
UninstallProgressForm.CancelButton.ModalResult := CancelButtonModalResult;
UninstallProgressForm.PageNameLabel.Caption := PageNameLabel;
UninstallProgressForm.PageDescriptionLabel.Caption := PageDescriptionLabel;
UninstallProgressForm.InnerNotebook.ActivePage :=
UninstallProgressForm.InstallingPage;
end;
end;
其实inno setup就自带帮助文档和很多示例代码,在安装路径中就可找到。