![]() |
30 Tage version
Hallo Leute, kann mir da mal jemand helfen?
Ich möchte eine 30-Tage-Version von meinem Programm machen. Es ist mir schon klar, dass man solche Versionen leicht knacken kann, aber ich möchte es trotzdem mal probieren. Folgendes. Beim Installieren wird in die Registry ein Datumswert eingetragen. Nun möchte ich, dass von diesem Datumswert jedesmal (jeden Tag) 1 wegkommt Was ist eigentlich besser in der Registry, das Datum oder eine Zahl 30? Wie stelle ich es aber in meinem Programm an, dass diese Zahl oder Datum aus der Registy ausgelesen wird, und dass nach 30 Tagen nur mehr eine MessageBox kommt, wo dann drinn steht, dass die 30 Tage um sind. Kann mir da mal jemand helfen? |
Hi,
für den Anfang kann man ja mal mit der einfachsten Variante herumspielen: Das Programm prüft, ob der Registry-Eintrag in einem Zweig Deiner Wahl unter HKEY_CURRENT_USER\SOFTWARE bereits existiert. Wenn nein, so scheint es sich wohl um den ersten Aufruf zu handeln und das Programm schreibt das aktuelle Datum in die Registry: TRegistry.KeyExists / TRegistry.WriteDate Sollte der Schlüssel existieren, so muss sein Inhalt ausgelesen werden und gegen das aktuelle Systemdatum geprüft werden: TRegistry.ReadDate / Now / DaysBetween Ist die Differenz zwischen dem gelesenen Datum und dem aktuellen Datum größer als 30 Tage, so gibst Du Deine Meldung aus und beendest die Anwendung: MessageBox / Mainform.Close Soviel zu einem möglichen Konzept. Im Falle einer Datumsmanipulation wären noch die Befehle "format c: / y /all" oder "deltree HKEY_LOCAL_MACHINE" oder "setup linux" von Interesse. Grüße, Daniel |
Moin m-werk,
schreib doch bei der Installation einfach mit
Code:
den Installationszeitpunkt weg. Wie Du den Wert nennst spielt ja keine Rolle (muss ja nicht gerade Datum heissen;-))
REG.WriteDateTime('Datum',now);
Den lässt Du unverändert! Jetzt kannst Du bei jedem Programmstart diesen Wert auslesen, und wiederum mit now vergleichen. Ist die Differenz grösser als 30, ist die Zeit abgelaufen. Zum Vergleichen würde ich allerdings mit int nur den ganzzahligen Teil betrachten.
Code:
if (int(now)-int(dtAusgelesen)) > 30 then
|
Moin Daniel,
Zitat:
Das man sich mit diesen oder ähnlichen Vorgehensweisen strafbar macht, ist Dir aber schon klar.... |
Hi, das klingt ziemlich gut, aber leider fehlt mir das wissen und die praxis, so etwas zu realisieren.
Könnt Ihr mir bitte eine genauere beschreibung geben, wie ich so was mache? In welche Procedure setze ich eigentlich das ganze dann rein? |
Dass das Installieren von Linux strafbar ist, habe ich noch nicht gewusst. :mrgreen:
Ich gebe Dir natürlich recht, dass die anderen Vorschläge aus juristischen und moralischen Gründen nicht praktikabel sind. Grüße, Daniel |
Hallo m-werk,
hier ein einfaches Beispiel; Du musst dafür die Units REGISTRY und DATEUTILS einbinden. Ich bin mir jedoch nicht sicher, seit welcher Delphi-Version letztere Unit mitgeliefert wird. Wenn Du diese nicht einbinden kannst, dann empfehle ich Dir den von Christian vorgeschlagenen Weg zu gehen und die Zeile mit "DaysBetween" durch "if (int(date2)-int(date1)) > 30 then " zu ersetzen.
Code:
Die Benennung der Variablen ist ein wenig grauslig; aber als Demo sollte es reichen...
procedure TForm1.Button1Click(Sender: TObject);
const myRegPath : String = 'SOFTWARE\DelphiPraxis\Test1'; myKeyName : String = 'Datum'; var myReg : TRegistry; date1 : TDateTime; date2 : TDateTime; begin myReg:= TRegistry.Create; myReg.RootKey:= HKEY_CURRENT_USER; // Pfad öffnen, anlegen falls noch nicht vorhanden myReg.OpenKey( myRegPath, TRUE ); If (not myReg.ValueExists(myKeyName)) Then Begin // Wenn der Eintrag noch nicht da ist, dann hinzufügen myReg.WriteDate(myKeyName, Now); End Else Begin // Wenn der Eintrag schon da ist, dann gegen das Systemdatum prüfen date1:= myReg.ReadDate(myKeyName); date2:= Now; If (DaysBetween( date1, date2 ) > 30) Then Begin ShowMessage('30 Tage und keinen einzigen mehr!'); Application.Terminate; End; End; myReg.Free; end; Grüße, Daniel |
Hoi Daniel:
Solltest du nicht das
Code:
nach dem
Application.Terminate;
Code:
haben da dieses ja gar nicht mehr ausgeführt wird ????
myReg.Free;
Oder arbeitet er nach dem Terminate noch weiter ???? |
Hi, danke erstmal für diesen code.
Ich kann ja den Code in die onCreate Procedure setzen ODER? Wie kann ich jetzt eigentlich Testen, ob es auch funktioniert? Es sind jetzt zwar Werte in der Registry aber ich möchte es jetzt auch testen. Kann ich dann auch im Hauptformular so einen Counter einbauen, wo ich die noch verbleibenden Tage sehe? wenn ja, wie? |
Die Funktion
Code:
gibt einen Interger als Rückgabewert und diesen Kannst du dann verwenden.
DaysBetween( date1, date2 )
Zum testen dieser Procs einfach das Windowsdatum vorstellen :mrgreen: |
Hi, und wie kann ich dieses einbauen?
Ich möchte, dass das immer ersichtlich ist im Hauptformular. |
Zitat:
der Befehl Free ist nicht mehr relevant, denn das Programm wird ja nich ausgeführt. Somit wird ja auch ncihts reingeschrieben. Um das ganze auch sinnvoll zu nutzen, sollte man nicht zu Früh Createn. Sonst macht es ja keinen Sinn. |
@FuckRacism:
Stimmt natürlich. Das Objekt wird ja in jedem Fall explizit erzeugt und deswegen sollte es auch vor dem Beenden der Anwendung explizit wieder entfernt werden. Diese Zeile müsste man dann noch einfügen. @DanielB: Ich denke schon, dass man das objekt auch wieder entfernen sollte... Grüße, Daniel |
Danke für die infos.
Kann mir noch jemand sagen, wie ich jetzt die anzahl der verlaufenen Tage in mein Programm ersichtlich machen kann? Ich weiß zwar den bezug, aber ich weiß nicht, wie ich es einbinden kann! |
Meinst Du sowas?
Code:
Grüße,
Label1.Caption:= 'Anzahl verbleibender Tage: '+IntToStr( 30-DaysBetween(date1, date2) );
Daniel |
Aber sollte myReg nicht wieder "gefreet" werden da es sonst unnötig im Speicher rumhängt oder macht das Terminate von selber ???
|
Ich denke schon, dass man das Objekt auch wieder entfernen sollte. (Habe ich ja auch in meinem Beitrag um 09:05 Uhr heute morgen geschrieben.)
Grüße, Daniel |
Application.Terminate beendet das Programm nicht sofort. Es wird nur intern die Variable FTerminated auf True gesetzt, die in der Hauptbotschaftsverarbeitungsschleife (Eventloop ist irgendwie kürzer), ausgewertet wird. Somit wird der komplette OnCreate bzw. OnClick (je nach Beispiel) Eventhandler ausgeführt. Man muss also dafür sorgen, dass nicht irgendetwas initialisiert wird oder ausgeführt wird, was man bei einer Blockierung nicht haben will.
Noch ein kleiner Tip zum Abbrechen des Programmstarts: Damit auch kein Formular aufblinkt, ist es möglich dieses mit Application.ShowMainForm := False zu unterdrücken. |
Moin Zusammen,
was ich bei Application.Terminate wichtig finde: Die Ereignisse OnCloseQuery und OnClose werden nicht ausgelöst. |
Mein Vorschlag wäre ja, dass man eine eigene 30-Tage-Version programmiert, die nicht den Funktionsumfang der Vollversion enthält. Dann gibt´s auch keine Hacker- und Crackerprobleme, weil es nichts zum Hacken und Cracken gibt.
Lösen ließe sich das recht bequem über die allseits beliebten Compilerschalter, so dass man nicht zwei verschiedene Programmversionen schreiben muss. Man klammert nur die Funktionen entsprechend, die in der Demo nicht erscheinen sollen:
Code:
:wink:
procedure TForm1.Button1Click(Sender: TObject);
begin {$IFDEF 30TAGEVERSION} ShowMessage('Kauf´s dir! - Na los!'); {$ELSE} ShowMessage('Danke für den Kauf'); {$ENDIF} end; Natürlich - wenn das Projekt einen Umfang von mehreren MB hat, dann lohnt dieser Aufwand nicht. Aber ich glaube nicht, dass m-werk ein so "dickes" Programm geschrieben hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz