安装期间INNO设置中的HTTP请求是否有序列号验证?

时间:2013-08-25 15:37:21

标签: c# validation inno-setup

我想在安装过程中提交用户输入的序列号,并验证许可证密钥是否有效,如果有效,那么他应该能够继续安装,否则我应该向他显示消息密钥无效......

我有一个web服务,返回布尔值true或false ...

mylocalhost / SampleWebService / Service.amsx,它有一个方法LicenseValidation(),它将密钥作为字符串...

HTTP POST request in Inno Setup Script

http://turngeek.blogspot.hk/2012/04/making-web-request-within-inno-setup.html

如何在Web服务中调用我的方法LicenseValidation()并传递用户输入的值?

 [code]
 function SetFocus(hWnd: HWND): HWND;
 external 'SetFocus@user32.dll stdcall';
 function OpenClipboard(hWndNewOwner: HWND): BOOL;
 external 'OpenClipboard@user32.dll stdcall';
 function GetClipboardData(uFormat: UINT): THandle;
 external 'GetClipboardData@user32.dll stdcall';
 function CloseClipboard: BOOL;
 external 'CloseClipboard@user32.dll stdcall';
 function GlobalLock(hMem: THandle): PAnsiChar;
 external 'GlobalLock@kernel32.dll stdcall';
 function GlobalUnlock(hMem: THandle): BOOL;
  external 'GlobalUnlock@kernel32.dll stdcall';

  var
  SerialPage: TWizardPage;
  SerialEdits: array of TEdit;

  const
  CF_TEXT = 1;
  VK_BACK = 8;
  SC_EDITCOUNT = 6;
  SC_CHARCOUNT = 5;

 function GetClipboardText: string;
 var
 Data: THandle;
 begin
 Result := '';
 if OpenClipboard(0) then
 try
  Data := GetClipboardData(CF_TEXT);
  if Data <> 0 then
  Result := String(GlobalLock(Data));
 finally
if Data <> 0 then
  GlobalUnlock(Data);
CloseClipboard;
end;
end;

function TryPasteSerialNumber: Boolean;
var  
S: string;
I: Integer;
J: Integer;
Delimiter: string;
begin
Result := True;
Delimiter := '-';
S := GetClipboardText;    
if Length(S) <> ((SC_EDITCOUNT * SC_CHARCOUNT) + 
((SC_EDITCOUNT - 1) * Length(Delimiter))) then
Exit;    
for I := 0 to GetArrayLength(SerialEdits) - 1 do
begin
J := (I * SC_CHARCOUNT) + (I * Length(Delimiter)) + 1;
SerialEdits[I].Text := Copy(S, J, SC_CHARCOUNT);
end;
end;

 function GetSerialNumber(const ADelimiter: Char): string;
 var
 I: Integer;
 begin
 Result := '';
 for I := 0 to GetArrayLength(SerialEdits) - 1 do
 Result := Result + SerialEdits[I].Text + ADelimiter;
 Delete(Result, Length(Result), 1);
 end;

 procedure OnSerialEditChange(Sender: TObject);
 var
 CanContinue: Boolean;
 begin
 // the GetSerialNumber defined there returns you the serial number string
 // built from each edit box delimited by the char passed as a parameter
 CanContinue := GetSerialNumber('-') = '62FFU-GA4N8-T8N6W-WLQJW-N6WLQ-AJKD6';
 WizardForm.NextButton.Enabled := CanContinue;
 end;

 procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
 var
 Edit: TEdit;
 EditIndex: Integer;
 begin
 Edit := TEdit(Sender);
 EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder;
 if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then
  begin
  if TryPasteSerialNumber then
  Key := 0;
end
else
if (Key >= 32) and (Key <= 255) then
begin
if Length(Edit.Text) = SC_CHARCOUNT - 1 then
begin
if EditIndex < GetArrayLength(SerialEdits) - 1 then
    SetFocus(SerialEdits[EditIndex + 1].Handle)
  else
    SetFocus(WizardForm.NextButton.Handle);
end;
end
else
if Key = VK_BACK then
if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then
  SetFocus(SerialEdits[EditIndex - 1].Handle);
  end;

 procedure CreateSerialNumberPage;
 var
 I: Integer;
 Edit: TEdit;
 DescLabel: TLabel;
 EditWidth: Integer;
 begin
 SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation',
  'Enter the valid serial number');

 DescLabel := TLabel.Create(SerialPage);
 DescLabel.Top := 16;
 DescLabel.Left := 0;
 DescLabel.Parent := SerialPage.Surface;
 DescLabel.Caption := 'Enter the valid serial number and continue .';
 DescLabel.Font.Style := [fsBold];

 SetArrayLength(SerialEdits, SC_EDITCOUNT);
EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT;

for I := 0 to SC_EDITCOUNT - 1 do
begin
Edit := TEdit.Create(SerialPage);
Edit.Top := 40;
Edit.Left := I * (EditWidth + 8);
Edit.Width := EditWidth;
Edit.CharCase := ecUpperCase;
Edit.MaxLength := SC_CHARCOUNT;
Edit.Parent := SerialPage.Surface;
Edit.OnChange := @OnSerialEditChange;
Edit.OnKeyDown := @OnSerialEditKeyDown;
SerialEdits[I] := Edit;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = SerialPage.ID then
WizardForm.NextButton.Enabled := False;  
end;

procedure InitializeWizard;
begin
CreateSerialNumberPage;
end;

0 个答案:

没有答案