Seite 2 von 2

Re: Ablaufdatum

Verfasst: 09.12.2016 18:58
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?

Re: Ablaufdatum

Verfasst: 09.12.2016 19:43
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

Re: Ablaufdatum

Verfasst: 09.12.2016 20:06
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


Re: Ablaufdatum

Verfasst: 09.12.2016 22:48
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

Re: Ablaufdatum

Verfasst: 11.12.2016 00:01
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