Ablaufdatum

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Ablaufdatum

Beitrag von edel »

DarkSoul hat geschrieben: PS: Kennt jemand irgendwen, der WinRAR benutzt, und jemals die Lizenz erworben hat? :mrgreen: :mrgreen:
Ja, ich. :twisted:

Topic:
Ist es eigentlich legal, ein Programm automatisch loeschen zu lassen ,ohne das es der Benutzer es will?
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Ablaufdatum

Beitrag von man-in-black »

Hi,

kenn mich jetzt mit Recht nicht aus, aber wenn der Nutzer im Vorfeld darauf hingewiesen wurde
und der Kauf nur über eine permanente Nutzung erfolgt, sind doch sowohl Käufer als auch Verkäufer
auf den Deal eingegangen.

MFG
man-in-white :P
(hab alles, kann alles, weiß alles!!^^)

Bild
Fanpost
Beiträge: 97
Registriert: 27.01.2013 14:43

Re: Ablaufdatum

Beitrag von Fanpost »

So, habe im Web eine Routine zum Lesen/Schreiben in die Registry "geklaut" und für mein Vorhaben angepasst.
Kann evtl. verbessert werden, aber ich bin halt nur Anfänger und "Gelegenheitsprogrammierer" :mrgreen:

Code: Alles auswählen

Procedure RegWriteDword(HKMain,HKSub$,HKEntry$,HKValue.l)
If RegCreateKeyEx_(HKMain, HKSub$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo)= #ERROR_SUCCESS 
  RegSetValueEx_(NewKey, HKEntry$, 0, #REG_DWORD, @HKValue,4)
  RegCloseKey_(NewKey)
EndIf
EndProcedure

;-======== Read DWORD from Registry =======
Procedure RegReadDWord(section,path$,key$)
  value=-1 : datasize.l=4 ; 4 bytes = 32 bits (long).
  If RegOpenKeyEx_(section,path$,0,#KEY_READ,@tmp)=#ERROR_SUCCESS
    If RegQueryValueEx_(tmp,key$,0,0,@value,@datasize)<>#ERROR_SUCCESS : value=-1 : EndIf
    RegCloseKey_(tmp)
  EndIf
  ProcedureReturn value
EndProcedure
;
 Ablaufdatum$ = FormatDate("%dd%mm%yyyy", Date())
; 
 If Ablaufdatum$ >"17122016"; hier Ablaufdatum eintragen
   ValueWrite.l = 2016
   RegWriteDword(#HKEY_CURRENT_USER,"Software\DTM\Test","TestEntry",ValueWrite)
 EndIf
; 
; 
   ;----- Read DWORD value -----
 ValueRead.l = RegReadDWord(#HKEY_CURRENT_USER,"Software\DTM\Test","TestEntry")
 ;Debug ValueRead
; 
 If ValueRead=2016
   If OpenWindow(0, 0, 0, 270, 120, "Hinweis", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      TextGadget(0, 10,  40, 250, 20, "Die Testversion des Programms ist abgelaufen!", #PB_Text_Center)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
   EndIf
    End
 EndIf

Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Ablaufdatum

Beitrag von NicknameFJ »

Hallo,

diese Prüfung wird scheitern

Code: Alles auswählen

 Ablaufdatum$ = FormatDate("%dd%mm%yyyy", Date())
;
 If Ablaufdatum$ >"17122016"; hier Ablaufdatum eintragen
Ist Ablaufdatum$ z.B. "18112015" was ja eigentlich kleiner ist da das zugrundeliegende Datum der 18.11.2015 ja vor dem 17.12.2016 liegt, ist es beim Stringvergleich jedoch größer

Du könntest das Format %yyyy%mm%dd oder gleich den Zahlenwert von date() verwenden.

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Ablaufdatum

Beitrag von DarkSoul »

Quizfrage: Wenn ein Programm das nicht in AppData oder im eigenen Programmordner speichert, wo denn dann? :bounce:

Da da nur eine sinnvolle Möglichkeit übrig bleibt, wird der User wohl als nächstes in der Registry nachschauen und den angelegten Key auf 01.01.3456 umstellen... :mrgreen:

Ob Datei oder Registry, ist ziemlich egal...

PS:

- Du hast das Ablaufdatum hardgecodet und fragst Date() ab.
- Damit prüfst du, ob abgelaufen oder nicht. -> Ergebnis in die Registry (2016 = true, alles andere = false)
- Dann liest du den Wert von dort wieder aus.
- If gelesener Wert = 2016 -> Abbruch

Der Registryeintrag hat hier überhaupt keinen Nutzen.

Wenn du einen Wert speicherst, dann das Ergebnis von Date() des ersten Programmstarts und nicht das momentane Datum, das du ohnehin per Date() zur Verfügung hast.

Wenn du die unformatierten Timestamps speicherst und abgleichst (ohne FormatDate() dazwischen), dann funktionieren auch die Abfragen richtig

Ungefähr so wäre es besser (ungetesteter Pseudo-Code)

Code: Alles auswählen

AktuellesDatum.i = Date()  
AnfangsDatum.i = GetInitialLaunchDate()  ;Testphasenbeginn abfragen
Abgelaufen.i = GetIsExpired() ;Wird bei einmalig erkanntem Ablauf auf True gesetzt, damit, wenn der User die Uhr ein stückchen zurückdreht, das Programm nicht wieder läuft
If AnfangsDatum = 0 ;Nichts da? -> erster Start!
 AnfangsDatum = AktuellesDatum  ;Jetzt beginnt die Testphase
 SetInitialLaunchDate(AnfangsDatum) ;Testphasenbeginn speichern (registry oder so)
EndIf
If Abgelaufen = #True Or AktuellesDatum > Anfangsdatum + #Testzeit Or AktuellesDatum < Anfangsdatum
 SetIsExpired(#True) ; "Dauerhaft" deaktivieren
 If OpenWindow(0, 0, 0, 270, 120, "Hinweis", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  ;MessageRequester()?
  TextGadget(0, 10,  40, 250, 20, "Die Testversion des Programms ist abgelaufen!", #PB_Text_Center)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
 Endif
 End ;wichtig, dass das End hier nach dem IF steht! Sonst geht dein Programm trotzdem auf, sollte OpenWindow() versagen... :mrgreen: 
Endif
Bild
Antworten