dragodraki
Goto Top

Wie kann ich bei Inno Setup in meinem Code die Lizenz definieren?

Hi Forum,

ich nutze in meiner Freizeit das Programm "Inno Setup" zur Setuperstellung. Da ich mich mit dem Teil "[Code]" so gut wie gar nicht auskenne, aber eine individuelle Lizenzabfrage mit einem 25-stelligen Raster haben wollte, habe ich mir eine Vorlage aus dem Internet gezogen. Das Skript zeigt mir die Abfrage dekorativ sehr schön an, nur leider lässt es die Eingabe jedes beliebigen Lizenzschlüssels - soweit er 25-stellig ist - zu. Das möchte ich nun ändern, weiß aber nicht, wo ich im Code meine Lizenz im Klartext definieren muss.
Es wäre wirklich toll, wenn mir einer dabei helfen könnte. Mit #define SerialNumber "12345-12345-12345-12345-12345" habe ich es schon versucht, das funktioniert leider nicht, weil die Definition irgendwo im Bereich "[Code]" und nicht am Skriptanfang hinterlegt werden muss.

Dragodraki


Und hier ist das gesamte Skript:


; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Sternenfabrik"
#define MyAppVersion "1.0"
#define MyAppPublisher "Dragodraki"
#define MyAppExeName "Sternenfabrik.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=58C2C487-A993-65CA-A08C-C2D4793A862C}AppName={#MyAppName}AppVersion={#MyAppVersion};AppVerName={#MyAppName} {#MyAppVersion}AppPublisher={#MyAppPublisher}DefaultDirName={pf}\{#MyAppName}DefaultGroupName={#MyAppName}AllowNoIcons=yesLicenseFile=C:\EULA.txtOutputDir=C:\TestergebnisOutputBaseFilename=SetupSetupIconFile=C:\Sternenfabrik.icoCompression=lzmaSolidCompression=yesDiskSpanning=yesSlicesPerDisk=1DiskSliceSize=2100000000WizardImageFile=C:\Header.bmp [Languages]Name: "german"; MessagesFile: "compiler:Languages\German.isl"[Tasks]Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked[Files]Source: "C:\Test\Sternenfabrik.exe"; DestDir: "{app}"; Flags: ignoreversionSource: "C:\Test\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; NOTE: Don't use "Flags: ignoreversion" on any shared system files[Icons]Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon[Run]Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')"; Flags: nowait postinstall skipifsilent

[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;
SC_DELIMITER = '-';

function IsValidInput: Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to GetArrayLength(SerialEdits) - 1 do
if Length(SerialEdits[I].Text) < SC_CHARCOUNT then
begin
Result := False;
Break;
end;
end;

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 GetSerialNumber(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;

function TrySetSerialNumber(const ASerialNumber: string; ADelimiter: Char): Boolean;
var
I: Integer;
J: Integer;
begin
Result := False;

if Length(ASerialNumber) = ((SC_EDITCOUNT * SC_CHARCOUNT) + (SC_EDITCOUNT - 1)) then
begin
for I := 1 to SC_EDITCOUNT - 1 do
if ASerialNumber[(I * SC_CHARCOUNT) + I] <> ADelimiter then
Exit;

for I := 0 to GetArrayLength(SerialEdits) - 1 do
begin
J := (I * SC_CHARCOUNT) + I + 1;
SerialEdits[I].Text := Copy(ASerialNumber, J, SC_CHARCOUNT);
end;

Result := True;
end;
end;

function TryPasteSerialNumber: Boolean;
begin
Result := TrySetSerialNumber(GetClipboardText, SC_DELIMITER);
end;

procedure OnSerialEditChange(Sender: TObject);
begin
WizardForm.NextButton.Enabled := IsValidInput;
end;

procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Edit: TEdit;
EditIndex: Integer;
begin
Edit := TEdit(Sender);
EditIndex := Edit.TabOrder - SerialEdits.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, 'Lizenzschlüssel-Validierung',
'Verifizieren Sie Ihr Produkt');

DescLabel := TLabel.Create(SerialPage);
DescLabel.Top := 16;
DescLabel.Left := 0;
DescLabel.Parent := SerialPage.Surface;
DescLabel.Caption := 'Geben Sie den Lizenzschlüssel ein, um die Installation fortzusetzen...';
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 := IsValidInput;
end;

procedure InitializeWizard;
begin
CreateSerialNumberPage;
end;

Content-Key: 373605

Url: https://administrator.de/contentid/373605

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: 136166
136166 13.05.2018 aktualisiert um 14:40:14 Uhr
Goto Top
weiß aber nicht, wo ich im Code meine Lizenz im Klartext definieren muss.
Das dümmste was man machen kann, knackt ein Laie in 2 Minuten.

Die Funktion IsValidInput() sagt doch schon alles, oder was verstehst du daran nicht?
function IsValidInput: Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to GetArrayLength(SerialEdits) - 1 do
if Length(SerialEdits[I].Text) < SC_CHARCOUNT then
begin
Result := False;
Break;
end;
end;
Besonders
if Length(SerialEdits[I].Text) < SC_CHARCOUNT then
Vergleicht nur die Länge, und wenn die kleiner als SC_CHARCOUNT ist gilt die Seriennummer als nicht gültig. Also wenn du hier unbedingt eine feste Nummer hinterlegen willst vergleiche einfach den Textinhalt mit deiner festen Nummer, fertig.
if SerialEdits[I].Text <> "BLABLUB" then 
Mitglied: Dragodraki
Dragodraki 15.05.2018 um 21:39:46 Uhr
Goto Top
Danke für die Hilfe ReadyPlayerOne, aber wenn ich die Zeile anstelle der Abfrage zum SC_CHARCOUNT einbinde, funktioniert gar kein Key mehr - weder der richtige noch der falsche. Es funktioniert damit also leider noch nicht.
Des Weiteren bin ich dir zwar dankbar für den Tipp, dass der Klartext zu ungeschützt ist, allerdings kann man dies ja auch etwas konstruktiver vermitteln, oder? Ich sagte ja schließlich, dass ich auf diesem Gebiet nicht viel Ahnung habe.