0

I would like to submit the serial number entered by the user during installation and verify if the license key is valid or not, if its valid then he should be able to proceed with the installation else i should show him the message that the key is not valid...

I have a webservice for this that returns boolean true or false...

mylocalhost/SampleWebService/Service.amsx and it has a method LicenseValidation() that takes the key as string...

HTTP POST request in Inno Setup Script

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

how can i call my method LicenseValidation() in the webservice and pass the value entered by the user?

 [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;
Community
  • 1
  • 1
sebastian
  • 837
  • 1
  • 8
  • 18
  • When do you want to validate the serial number (I guess when you press the next button; just need to confirm that) ? And without knowing your service is hard to advice how to make a request to it. Also, I'd like know, how in the world people can break the code formatting this way. Is that so hard to copy and paste (it looks exactly like [`a script`](http://stackoverflow.com/a/10392094/960757) I've made some time ago, but with broken formatting) ? – TLama Aug 25 '13 at 16:36
  • yes, i used the script you posted in stackoverflow to validate against a constant....and yes i want to validate the serial key when the user clicks the next button....i used a simple webservice which takes the key entered by the user and returns true or false..if its true the user should proceed else it should show error message....need your help regarding this.. – sebastian Aug 25 '13 at 16:48
  • Well, you know how to get the serial number entered by the user (`GetSerialNumber` function), it seems you know how to [`make a request`](http://stackoverflow.com/q/18432325/960757) to your web service and now also how to [`stay on the page`](http://stackoverflow.com/a/18432523/960757) when the validation fails. So could you please simplify, or somehow rephrase this question to address the problem you've had here ? – TLama Aug 25 '13 at 19:53

0 Answers0