Benutzer mit den meisten Antworten
Visual Basic 2010 Express.Hilfe für Code Laufzeitbeschränkung gesucht.

Frage
-
Hallo, mag mir jemand bei diesen Code weiterhelfen? Er funktioniert soweit gut jedoch bei der Systemzeit änderung bleibt das Pogramm weiter Aktiv nach 15 Tagen.Mit freischaltungscode und sowas brauch ich nicht.Möchte das es nach einer gewissen Zeit nicht mehr funktioniert. Was fehlt bei dem Code?!Über hilfe wurde ich mich sehr freuen den mir fällt da nicht zu sein vielleicht dachte ich mir das Datum in einer xml datei zu schreiben oder unter my sittings zu speichern.Wurdet ihr mir nen kleinen code snipsel einbauen das es geht?! Danköö
Option Explicit On Option Strict Off Imports System Imports System.IO Imports System.Text Imports System.Management Imports System.Security.Cryptography Public Class MainForm_frm Private WithEvents x As New RuntimeRestriction(15) Private Sub MainForm_frm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load x.StartRuntimeRestriction("30daytestA") x.CheckRuntime() lbldauer.Text = Date.Now End Sub Public Sub RuntimeEnd() Handles x.RuntimeEnd MsgBox("Testphase zuende!") End Sub Public Sub RuntimeChecked() Handles x.RuntimeChecked MsgBox("Die Laufzeit wurde geprüft") End Sub End Class
Public Sub CheckRuntime() Dim Val As String = Registry.GetValue("HKEY_CURRENT_USER\" & My.Application.Info.AssemblyName, "RuntimeRestriction", "0") If Val = "0" Then MsgBox("Error!") : Exit Sub RaiseEvent RuntimeChecked() If DateDiff(DateInterval.Day, Convert.ToDateTime(DCrypt(Val)), Date.Now) >= Days Then RaiseEvent RuntimeEnd() End If End Sub Public Sub StartRuntimeRestriction(ByVal AppName As String) Registry.SetValue("HKEY_CURRENT_USER\" & AppName, "RuntimeRestriction", Crypt(Date.Now.ToString)) End Sub Private Function Crypt(ByVal Txt As String) As String Dim out As String = Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(Txt)) out = System.Text.Encoding.Unicode.GetString(System.Text.Encoding.ASCII.GetBytes(out)) Return out End Function Private Function DCrypt(ByVal Txt As String) As String Dim out As String = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.Unicode.GetBytes(Txt)) out = System.Text.Encoding.Unicode.GetString(Convert.FromBase64String(out)) Return out End Function End Class
Antworten
-
Hallo bytezähler,
hier ein funktionierender Code:
Public Class Form1
Public Phase As Integer ' 0= noch nie gestartet 1= Testversion 2 = Testzeit überschritten
Public TestStart As Date
Public TestEnde As Date
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Diese 4 Controls für Testzwecke auf True setzen
Me.lbl_Phase.Visible = False
Me.lbl_TestStart.Visible = False
Me.lbl_TestEnde.Visible = False
Me.Button1.Visible = False
Try
If My.Settings.Set_Phase = 0 Then
Phase = 1
TestStart = Now
Me.lbl_TestStart.Text = TestStart
TestEnde = TestStart.AddDays(30)
Me.lbl_TestEnde.Text = TestEnde
My.Settings.Set_Phase = Phase
My.Settings.Set_Start = TestStart.ToString()
My.Settings.Set_Ende = TestEnde.ToString()
My.Settings.Save()
Else
Me.lbl_TestStart.Text = My.Settings.Set_Start.ToString()
Me.lbl_TestEnde.Text = My.Settings.Set_Ende.ToString()
If Now < Me.lbl_TestStart.Text Then
MsgBox("Sie haben die Systemzeit zurück gestellt - lass doch den Unfug :-) ")
Phase = 2
My.Settings.Set_Phase = Phase
My.Settings.Save()
ElseIf Now >= Me.lbl_TestEnde.Text Then
Phase = 2
My.Settings.Set_Phase = Phase
My.Settings.Save()
MsgBox("Die 30 Tage Demo-Version ist abgelaufen. Wenn Ihnen das Programm gefallen hat, kaufen Sie es bitte. ")
ElseIf Now > Me.lbl_TestStart.Text And Now < Me.lbl_TestEnde.Text Then
Phase = My.Settings.Set_Phase
If Phase = 1 Then
MsgBox("Wir sind im grünen Breich.")
ElseIf Phase = 2 Then
MsgBox("So bitte nicht")
End If
End If
End If
Catch ex As Exception
Phase = 1
My.Settings.Set_Phase = Phase
My.Settings.Save()
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Mit diesem Button setzt du während der Tests deine Wert auf Null
Phase = 0
My.Settings.Set_Phase = Phase
My.Settings.Save()
End Sub
End ClassVersuchs mal.
1. Wenn das Datum stimmt.
2. Wenn du das Datum auf ein Datum stellst das vor der ersten Inbetriebnahme liegt
3. Wenn du das Datum auf einen Zeitpunkt nach dem Ablauf stellst UND
4. Wenn die 30 Tage abgelaufen sind und du das Datum auf einen Zeitpunkt zurück stellst zu dem die Testversion einmal gültig war.Viel Erfolg
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/- Als Antwort markiert bytezähler Samstag, 9. April 2011 22:35
Alle Antworten
-
Hallo bytezähler,
irgendwie finde ich zwei "End Class"-Statements aber nur ein öffnendes Statement... Läuft das bei Dir nicht auf den Hammer???
Gruß
Marcus
Der erste Tag, an dem ich nichts Neues lerne, wird der Tag sein, an dem sich der Deckel über mir schließt... -
Naja, sein Code ist gekürzt. Nach dem ersten End Class kommt wohl die Beschreibung der Klasse RuntimeRestriction, wobei das Class und einiges sonst weggelassen wurden denke ich mal.
Das schließe ich zumindest aus dem Private WithEvents x As New RuntimeRestriction(15)
Aber ja - wenn man Code hinzufügen soll, dann macht es schon Sinn, ein lauffähiges Stück Code zu haben.
Mit den besten Grüßen,
Konrad
-
Hi:))
Bis zum ersten Class befindet sich das in der Form 1.das zweite class liegt in einer Klasse-Datei und wird so aufgerufen.
Private WithEvents x As New RuntimeRestriction(15) das im load x.StartRuntimeRestriction("30daytestA") x.CheckRuntime()
der funktioniert ja so einwanfrei jedoch bei der Datums änderung kann man das Pogramm wieder ausführen,das soll nicht sein.Hab schon versucht es in einer xml datei zu schreiben ,das man das datum festsetzt.bin da noch am tüfteln due halbe nacht gewesen.stimm! habe auch was vor endhalten so könnt ihr mir nicht helfen^^.
-
Imports Microsoft.Win32 Public Class RuntimeRestriction Event RuntimeEnd() Event RuntimeChecked() Dim Days As Integer Public Sub New(ByVal Days As Integer) Me.Days = Days End Sub Public Sub CheckRuntime() Dim Val As String = Registry.GetValue("HKEY_CURRENT_USER\" & My.Application.Info.AssemblyName, "RuntimeRestriction", "0") If Val = "0" Then MsgBox("Error!") : Exit Sub RaiseEvent RuntimeChecked() If DateDiff(DateInterval.Day, Convert.ToDateTime(DCrypt(Val)), Date.Now) >= Days Then RaiseEvent RuntimeEnd() End If End Sub Public Sub StartRuntimeRestriction(ByVal AppName As String) Registry.SetValue("HKEY_CURRENT_USER\" & AppName, "RuntimeRestriction", Crypt(Date.Now.ToString)) End Sub Private Function Crypt(ByVal Txt As String) As String Dim out As String = Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(Txt)) out = System.Text.Encoding.Unicode.GetString(System.Text.Encoding.ASCII.GetBytes(out)) Return out End Function Private Function DCrypt(ByVal Txt As String) As String Dim out As String = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.Unicode.GetBytes(Txt)) out = System.Text.Encoding.Unicode.GetString(Convert.FromBase64String(out)) Return out End Function End Class
-
Hallo Bytezähler,
was relativ einfaches wäre so was hier:
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ErtserStart As Date = Today Dim Testende As Date = Today.AddDays(30) Me.Label2.Text = My.Settings.Set_EndeTest Me.Label1.Text = ErtserStart If Me.Label2.Text = "ende" Then Me.Label2.Text = Testende My.Settings.Set_EndeTest = Me.Label2.Text My.Settings.Save() Else Me.Label2.Text = My.Settings.Set_EndeTest End If If Today < My.Settings.Set_EndeTest Then MsgBox("weiter testen...") ElseIf Today > My.Settings.Set_EndeTest Then MsgBox("Bitte, bitte kauf mich ..") End If End Sub End Class
Bitte genau testen.
Von der Idee her stellt das PRG das aktuelle Datum fest, addiert 30 Tage dazu und speichert dieses Datum über My.Settings.
Damit ist das Datum, wann die Testversion abläuft fix.
Bei jedem Programmstart prüfst du, ob das aktuelle Datum das "Verfallsdatum" überschritten hat.Sicher gibt es bessere oder professionelle Lösungen aber so kommst du auch ans Ziel.
Den Code kann man noch sicher noch knapper halten. Der wurde als "Schnellschuß" geschrieben.
Hoffe er hilft dir.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ErtserStart As Date = Today Dim Testende As Date = Today.AddDays(30) Me.Label2.Text = My.Settings.Set_EndeTest Me.Label1.Text = ErtserStart If Me.Label2.Text = "ende" Then Me.Label2.Text = Testende My.Settings.Set_EndeTest = Me.Label2.Text My.Settings.Save() Else Me.Label2.Text = My.Settings.Set_EndeTest End If If Today < My.Settings.Set_EndeTest Then MsgBox("weiter testen...") ElseIf Today > My.Settings.Set_EndeTest Then MsgBox("Bitte, bitte kauf mich ..") End If End Sub End Class
Hallo Giftzwockel
Wäre da nicht dann wieder das Problem das man einfach die Systemuhrzeit ändern könnte, und das Programm würde wieder laufen?
Man braucht also irgendwie für diese Zeit einen eigenen Zähler für die Tage...
- Bearbeitet Niklas R Donnerstag, 31. März 2011 19:37 Ergänzung
-
Hallo Niklas,
stimmt. Deswegen mein Einwand mit den professionellen Lösungen. Wenn du dir allerdings die "Mühe" machst und die Labels nicht darstellst und zusätzlich mit Erreichen der Meldung das man das Programm kaufen soll noch einen zweiten Wert mit My.Settings setzt der dem Programm sagt, dass die Demozeit abgelaufen ist, kann der Anwender so lange am Datum rumspielen wie er will. Oder habe ich da einen Denkfehler?
Wenn du also in diesem Bereich:
f Today < My.Settings.Set_EndeTest Then
MsgBox("weiter testen...")
ElseIf Today > My.Settings.Set_EndeTest Then
MsgBox("Bitte, bitte kauf mich ..")
End IfAnstelle der MsgBox ("Weitertesten" ) einen Wert setzt My.Settings.Demo_OK = True und anstelle "Bitte Kauf mich" den Wert auf False setzt.
Natürlich kannst du das Ereignis auch über LastAccessTime einer individuellen Datei überprüfen. Wenn ein letzter Zugriff einer Datei später war als das aktuell eingestellte Systemdatum, dann ist da was faul an der Sache.Meistens ist es ja so, das solche Anwender sich nicht das exakte Datum merken wann sie ein Testprogramm das erste Ma gestartet oder installiert haben.
Notfalls kannst du die genaue Uhrzeit und Datum ermitteln.
.. stellt sich eben die Frage wie viel Zeit man in diese Funktion investieren möchten.
Vielleicht genügt ja auch eine Kaufmotivationsmeldung der Art, dass bestimmte Funktionen mit eine "Warteschleife" z.B. 10 - 30 s mit Fortschrittsanzeige darauf hinweisen, dass dies eine Demoversion ist und die Kauflizenz diese Verzögerung nicht hat.Ober bei Ausdrucken kommt ein Hinweis im Text "Testversion".
Das liegt bei dir.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
Hallo Ihr beiden:)
danke für Eure gedanken.Den Code den ich oben gepostet hatte funktioniert nur das mit der Datummanipulation ist das Problem.
Eurer Code macht ein guten Eindruck da der so schnell hingeschrieben ist wie du sagst.Auf jedenfall geht er nicht über die Regestry.
Die Tage hatte ich geübt das Startdatum in einer TXT ersteinmal zu schreiben und das end Datum sollte in einer zweiter Datei und verglichen werden.Ich glaube so ganz spontan mal da kann jemand das datum hin und hier ändern wie er möchte ist das Datum erreicht ist den Schluss.Mir ist bei vielen Programmen auf gefallen das die das Aktuelle Datum etwa brauchen sonst meckern die rum.-So wie Windows Update oder antiviren Programme.Habe mir auch überlegt das Datum aus dem Internet zu aktualisieren zu lassen as vom System selbst.So sind meine neuen Denksätze:))
Giftzwockel? ist das Datum bei dein Code Manipulierbar ?
FormLoad Dim fs As New FileStream("DateStart.txt", FileMode.Create) Dim sw As New StreamWriter(fs) sw.Write(Date.Today.ToString) sw.Close() Dim fs2 As New FileStream("DateEnd.txt", FileMode.Create) Dim sw2 As New StreamWriter(fs2) sw2.Write(Date.Today.ToString) sw2.Close()
-
Dieser Code ist bei mir mit alleen "Welche eigenschaft fehlt dazu?
My.Settings.Set_EndeTest" sind blau unterstrichen.
Me.Label2.Text = My.Settings.Set_EndeTest
hab in settings Set_EndTest" eingetragen und Date.was kommt als wert rein?-denn er springt zu 2 Msgbox und label2 zeigt 00:00:00 an
MsgBox("Bitte, bitte kauf mich ..")
-
Hallo bytezähler,
ich fange hinten an. Hast du dem Control auch die Property Bindings zugewiesen?
Zu deinen anderen Fragen folgendes.
Ein Code, der manipulierbar ist, wäre contraproduktiv. Wie weit dehnt sich der Begriff manipulierbar bei dir?
Meine Idee ist die, dass du in jedem Fall die Controlsbzw. Werte im Verborgenen handelts. Was ich nicht sehe, versuche ich nicht zu ändern.
Ich würde also:1. Drei Werte verwalten und überprüfen.
1.1 Erster Wert aktuelles Datum bei Programmstart. Diesen Wert würde ich aber nur schreiben, so lange ein zweiter Wert z.B. Test as Boolean auf False steht. Deklariere eine Variable, die deinem Programm sagt, ob das Startdatum schon gespeichert wurde oder nicht. Da wäre z.B. Test As Boolean = false (noch nicht geschrieben = Test noch nicht gestatet) wenn dein Programm nun startet und Test = False dann nimmst du das aktuelle Datum und speicherst es als Start der Testphase. Außerdem addierts du z.B. 30 Tage und speichert den zweiten Wert als Ende der Testpahase. Den Wert Test setzt zu auf True (= Test läuft) und speicherst diesen ebenfalls als My.Setting.Beim Programmstart prüfts du alle drei Werte ab:
Ist der Wert Test auf False ermittelst und berechnest du die Daten und speicherst sie.
Ist der Wert False was nach einem ersten Start der Fall sein wird wennd er Code stimmt prüfst du drei Möglichkeiten:a: Wenn das aktuelle Systemdatum jünger ist als dein gespeichertes Startdatum wurde das Datum manipuliert. ... Zeit für den erhobenen Zeigefinger (bitte kauf mich).
b: Wennd as aktuelle Systemdatum älter ist als das Startdaum (gleich geht schon nicht mehr) und jünger als das Enddatum, dann läuft die Anwendung wie gewünscht.
c: Ist das aktuelle Datum älter als das Enddatum, dann soll der Kunde ebenfalls auf die Kaufoption hingewiesen werden. Hier bietet es sich an mit dem OK-Klick direkt auf deine Homepage zu verbinden(Process.Start(www.deinehomepage.com))Wenn du es besonders gut machen möchtest, kannst du anstelle des Wertes Test AS Boolean diesen auch als Integer deklarieren und mit den Werten 0 = Erster Start 1= Testpahse und 2= Enddatum wurde schon mal erreicht dahingehend absichern, dass ein Anwender mit erreichen der Endphase nicht für ein paar Tage das Datum zuück setzt.
In diesem Fall könntes du den Wert Test = 2 mit dem Klicken des OK-Button von 1 auf 2 setzen und speichern.
Wenn dann ein Anwender das Programm starten möchte kannst du direkt den Kaufanreiz starten.
Sicherheit: Speziell die zweite Lösung mit der Integer-Variable hat meiner Meinung nach einen speziellen Reiz denn damit fängst du ab, dass der Anwender sein Systemdaum auf ein Datum einstellt, das vor Inbetriebnahme gültig war, aber auch ein Datum, dass in der 30tagesfrist liegt, wäre damit erschlagen. Also relativ sicher und mit moderatem Programmieraufwand erledigt.Wenn der Anwender allerdings alle 30 Tage sein System neu installiert, klappt die Methode ebenso wenig wie der Weg über die Registry.
Falls du noch weitere Hilfe bei der Umsetzung benötigst, melde dich.Viel Erfolg
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
Hallo Du;)
Habe jetzt einmal ein Code gebastelt deiner streikt bei mir irgendwie.Joar,hab den Controls den gemacht. Ich möchte den neuen Code einmal Posten den er Funktioniert.Da ist wirklich nach einer beispieltestzeit von 30 Tagen aus.
Nur xD wenn die Zeit zurück gestellt wird kann man schön weiter Workn.Ich brauche irgendwo darin eine zweiter Datumchecker jedoch ders rückwärts checkt.
Eine Frage zu den my.sittings! Wie Remove ich sie daraus aus mein sittings?Denn alles ist festgeschrieben, muss ich zum weiteren testen wieder daraus löschen.
Ich sag mal was ich habe könnt ihr auch testen.
1.Form
1.Timer
2.Labels
Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If My.Settings.dateend = Nothing Then My.Settings.dateend = DateTime.Now.AddDays(30) My.Settings.Save() End If Me.lblend.Text = My.Settings.dateend End Sub Public Sub Dateupdate() Me.lblstart.Text = DateTime.Now End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Me.Dateupdate() If DateTime.Now > My.Settings.dateend Then MsgBox("Die Testzeit ist abgelaufen") Me.Close() My.Settings.Save() End If End Sub End Class
-
Hmm. Nur als generelle Anregung: Speichere doch bei jedem Check die Zeit (z.B. My.Settings.LastCheck). Dann kannst Du immer prüfen, ob My.Settings.LastCheck > DateTime.Now() ist (evtl. noch etwas Puffer geben, da ja die Uhr mal umgestellt werden kann und so) und dann einen Fehler ausgeben (Oder was auch immer machen!)
Und Du kannst dn Check erweitern auf if My.Settings.dateend = Nothing Or My,Settings.dateend = DateTime.MinValue Then, denn dann kannst Du reseten, indem Du My.Settings.dateend = DateTime.MinValue zusammen mit einem My.Settings.Save() für ein Reset durchführen.
Eine weitere Anmerkung wäre am Ende noch, dass My.Settings relativ einfach zu überlisten ist. Jemand, der das .Net Framework etwas kennt, findet die Settings-Datei und kann diese mit einem beliebigen Texteditor anpassen.... Also noch einfacher als Datum zurücksetzen :)
Mit den besten Grüßen,
Konrad
-
Hi Konrad,danke für deine Anregung.
Nun Mag ich was zum Thema sicherheit sagen.Ich dachte seit express 2010 kann man den code nicht mehr so leicht rauslesen da nützt ein nicht mal ne aktivierung.Ich nehme mal an das sind ganz normale Personen mit Pc kenntnissen die mein Pogramm nutzen,so dol ist das nun auch wieder nicht.das ist mein übungsprogramm das sich immer weiter ausbaut hehe.natürlich gibt es sicherlich leute die alles knacken können, aber davon gehe ich mal gerade nicht aus.
Die Beste schutz wäre es wenn dann zu kaufen auf Cd zu pressen und in den Alpen zu verkaufen*kleiner*spaß*
Ich will nur das man die Datums nicht mehr ändern kann auf einen einfachen Weg und sich nach einer Zeit einfach Deaktiviert.Find ich besser als sogar ein Freischaltcode zu nutzen.
Ich habe ein Pogramm von jemanden bevor ich es nutzen kann wählt es sich zu seinen Server und meldet sich dort erst an und prüft die Daten ab und läßt den erst das Programm frei.Davon habsch keine Ahnung den bin ja immer noch Anfänger.
Wie kann ich denn nun meine Sittings wieder löschen? kann mir jemand da ein kleinen sittings code schnipsel zaubern?
Konrad so lösche ich die sittings? Ich komme nämlich nicht weiter wenn die drinne sind.
See you und Thanks on allif My.Settings.dateend = Nothing Or My,Settings.dateend = DateTime.MinValue Then My.Settings.dateend = DateTime.MinValue My.Settings.Save() f
-
Hallo bytezähler,
hier ein funktionierender Code:
Public Class Form1
Public Phase As Integer ' 0= noch nie gestartet 1= Testversion 2 = Testzeit überschritten
Public TestStart As Date
Public TestEnde As Date
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Diese 4 Controls für Testzwecke auf True setzen
Me.lbl_Phase.Visible = False
Me.lbl_TestStart.Visible = False
Me.lbl_TestEnde.Visible = False
Me.Button1.Visible = False
Try
If My.Settings.Set_Phase = 0 Then
Phase = 1
TestStart = Now
Me.lbl_TestStart.Text = TestStart
TestEnde = TestStart.AddDays(30)
Me.lbl_TestEnde.Text = TestEnde
My.Settings.Set_Phase = Phase
My.Settings.Set_Start = TestStart.ToString()
My.Settings.Set_Ende = TestEnde.ToString()
My.Settings.Save()
Else
Me.lbl_TestStart.Text = My.Settings.Set_Start.ToString()
Me.lbl_TestEnde.Text = My.Settings.Set_Ende.ToString()
If Now < Me.lbl_TestStart.Text Then
MsgBox("Sie haben die Systemzeit zurück gestellt - lass doch den Unfug :-) ")
Phase = 2
My.Settings.Set_Phase = Phase
My.Settings.Save()
ElseIf Now >= Me.lbl_TestEnde.Text Then
Phase = 2
My.Settings.Set_Phase = Phase
My.Settings.Save()
MsgBox("Die 30 Tage Demo-Version ist abgelaufen. Wenn Ihnen das Programm gefallen hat, kaufen Sie es bitte. ")
ElseIf Now > Me.lbl_TestStart.Text And Now < Me.lbl_TestEnde.Text Then
Phase = My.Settings.Set_Phase
If Phase = 1 Then
MsgBox("Wir sind im grünen Breich.")
ElseIf Phase = 2 Then
MsgBox("So bitte nicht")
End If
End If
End If
Catch ex As Exception
Phase = 1
My.Settings.Set_Phase = Phase
My.Settings.Save()
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Mit diesem Button setzt du während der Tests deine Wert auf Null
Phase = 0
My.Settings.Set_Phase = Phase
My.Settings.Save()
End Sub
End ClassVersuchs mal.
1. Wenn das Datum stimmt.
2. Wenn du das Datum auf ein Datum stellst das vor der ersten Inbetriebnahme liegt
3. Wenn du das Datum auf einen Zeitpunkt nach dem Ablauf stellst UND
4. Wenn die 30 Tage abgelaufen sind und du das Datum auf einen Zeitpunkt zurück stellst zu dem die Testversion einmal gültig war.Viel Erfolg
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/- Als Antwort markiert bytezähler Samstag, 9. April 2011 22:35
-
Hallo Giftzwockel,erstmal vielen vielen Dank für deine Hilfe:)
Habe den Code getestet und und der Funktioniert:)
Habe jedoch dazu noch 1-2 Fragen zu my.sittings ob ich richtig dort eingestellt habe.
1.
Set_Phase " Integer" und als Wert"0" ist das richtig?
Set_Start " Dade"
Set_Ende "Dade"
2.
Ich erkenne keinen Unterschied wenn ich die Labels und Buttons von False auf True ändere.
Sollten die Unsichbar und der Button auch?Das machen die nicht.
3.
Das Label"Me.lbl_Phase.Visible = True" zeigt Phase an.Soll in diesen Label die Phasen 0-2 je angezeigt werden?
Nun kann ich ja deinen Supercode ja bei mir ins Programm nehmen.Denn muss ich nur noch in den endsprechenden abfragen ein"Me.close"für den form eintragen richtisch?
Danke hast du Super gezaubert:))
Edit
Frage 2 ist gelöst. Musste den Code neu einfügen den war alles auf false und nicht mehr sichtbar.waren noch einiges im sittings nicht gelöscht.
-
Hallo bytezähler,
zu 1:
Deine Syntax Set_Phase "Integer" und auch die anderen sind falsch. In meinem Code habe ich die als Public deklariet damit du sie nicht in jedem Sub neu deklarieren musst. Das ist dieser Teil:
Public Phase As Integer ' 0= noch nie gestartet 1= Testversion 2 = Testzeit überschritten
Public TestStart As Date
Public TestEnde As DateVariablen vom Typ Integer sind ganze Zahlen. Die reichen für diesen Zweck auch aus weil du ja nur unterscheiden möchtest 0, 1 oder 2.
Was möchtest du nun noch einstellen? Eigentlich ist doch in meinem Code alles schon geregelt und zwar hier:TestStart = Now ' die Variable die als TestStart deklariert wurde bekommt das aktuelle Datum mit Uhrzeit
Me.lbl_TestStart.Text = TestStart 'Label1 zeigt dir zur Kontrolle das Startdatum und Uhrzeit an. Diese Zeit wird auch gespeichert so lange der Wert Phase 0 ist
TestEnde = TestStart.AddDays(30) 'Hier addiert das Programm automatisch zum Startzeitpunkt 30 Tage dazu, den Wert in Klammern kannst du beliebig ändernMit diesem Teil sind dann Erster Start und der Ablauf der Testphase festgelegt. Das brauchst du gar nichts machen. Datum und Uhrzeit holt sich das Programm vom PC.
Diese Behandlung läuft dann, wenn das Programm das erste Mal gestarte ist also die Bedingung Phase = 0 erfüllt ist.
Darum wird im nächsten Schritt der Status des Programm geändert. Nämlich auf Phase = 1 was lt. Festlegung des Programmierers die Situtaion ist, in der das Programm in der Testphase läuft.Ob das Programm noch in den 30 Tagen Testphase ist erfolgt über den Vergleich des aktuellen Systemdatums. Dieses wird mit den ermittelten Startdatum und dem berechneten Ablaufdatum verglichen. Alles was dazwischen liegt (sogar auf die Sekunde genau) lässt den Test zu. Auchtung, diese Auswertung auf die Sekunde genau bezieht sicht bei diesem Code auf den Programmstart. Wenn du es auf die Spitze treiben möchtest, könntest du den Code über einen Timer laufen lassen und tatsächlich jede Sekunde oder alle 5 s prüfen - aber wer will das schon.
Bis hierher wäre der Code natürlich über das Datum des PC manipulierbar. Nun prüft aber das Programm auch immer die aktuelle Uhrzeit mit der Zeit zu der das Programm beim allerersten Mal gestartet wurde. Auch hier werden Datum und Uhrzeit (inkl. Sekunden) geprüft. Stellt jemand die Uhr vor, wäre es schon ein sehr großer Zufall es exakt in der Sekunde zu starten wie beim ersten Mal zumal du die Labels natürlich nicht zeigen sollt. Tritt dieser Fall ein (Zeit vorgestellt) ist das Programm nachtragend, es setzt die Phase auf Phase = 2 was das KO für den Anwender bedeutet. Für das Programm hat er nun entweder die Zeit überschritten oder vorgestellt.
Bei einer Überschreitung ist die Probezeit ohnehin abgelaufen, stellt er es "vorsorglich" mal vor um zu prüfen, ob er theoretisch mogeln könnte, hat er es nicht anders verdient (Hey, ich bin der Giftzwockel ;-) - ich mache so was !).
Zu 2.
Wenn dieser TeilMe.lbl_Phase.Visible = False
Me.lbl_TestStart.Visible = False
Me.lbl_TestEnde.Visible = False
Me.Button1.Visible = Falseaußerhalb der Try Catch Behandlung liegt, muss sich das Programm nach den Start so verhalten, dass die Labels und der Button nicht zu sehen sind. Wenn sich das Programm bei dir anders verhält musst du mal den Code posten, wie du ihn in dein Programm eingebunden hast.
Zu 3.
Ja, wennMe.lbl_Phase.Visible = True
im Code steht, wird dieses Label angezeigt und zeigt die an, welche Phase dein Programm gerade hat. Das ist aber nur zur Kontrolle während der Programmerstellung von Iteresse und hat für den Programmablauf selbst keinerlei Bedeutung.
Zu 3. Ja.
Wenn du eine Ausgabe mit vernünftigem Text, also nicht so einem Unfung wie beim mit ausgibst, kannst du ja direkt nach der Ausgabe der MsgBox die entsprechende Behandlung machen. Streng genommen sind das hier die beiden Fälle in denen der Hinweis gegeben wird, dass die Probezeit abgelaufen ist bzw. das Datum manipuliert wurde.
Hier setze einfach nach der MsgBox die Zeile:Me.Close()
Abschließend noch ein Hinweis. Du Schreibst immer Sittings. Es sind aber Settings (Einstellungen). Wenn man sich das falsch angewöhnt ist das nur schwer wieder rauszubekommen.
Nun viel Erfolg.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
Hallo Gifzwockel,
nun läuft das Pogramm in der Testform einwandfrei mit Angabe der einzelnen Phasen.Hatte es nicht mit den Controls(wie du oben beschrieben hattest) zu gewiesen.
Nun habe ich jedoch ein ganz anderes Problem bekommen.Füge ich den Code in meiner Pogrammform ein und Debuge in VB läuft die Laufzeitabfrage <8<ich nenne es nun jetzt so"^^ Ordnungsgemäß ab.
Gehe ich jedoch nach dem erstellen in den Debug Ordner sowie in den Relase Ordner und Starte da nun mein Pogramm mit den Code hier wird die Laufzeitabfrage nicht mehr abgefragt als wurde sie nicht exextieren. Selbst auf meine 2 anderen PC´s wird die Laufzeit nicht abgefragt und ich habe es genauso wie in der Testform gemacht.Die Funktioniert auf den anderen PC´s sogar in Relase Stadium.
Habe schon versucht #Region "xy"und #End Region einzusetzen jedoch schneidet es die anderen Codes in Load völlig ab.Werde einmal versuchen den Code hier in einen eigenen Public Sub zu schreiben und den im Load aufrufen.
Schönes Wochenende!
-
Hallo bytezähler,
offen gestanden verstehe ich nicht ganz was du da beschreibst.
Die Methode basiert darauf, dass ein Programm gestartet wird und nimmt die Einträge für das Programm mittels My.Settings vor.
An einem anderen PC heißt das natürlcihe "Neues Spiel, neues Glück". In normalfall kann ein Testprpgramm ja an viele Tester verteilt werden und jder PC ist anders beschaffen.Debug oder Release Ordner in der Entwicklungsumgebung sind immer speziell.
Vielleicht versucht du noch mal mir das Problem konkreter zu erklären. Momentan verstehe ich.
Auf jedem neuen PC wird das Programm jedoch nie eine bereits angestoßene Instanz prüfen falls du das meinst, sondern immer kontrollieren, on das Programm auf diesem PC schon mal gestarted wurde und dann entweder die Testdauer festlegen bzw. sich schon so verhalten wie beschrieben.
Wenn du das Prüfen möchtest lass dir einfach das Datum mit dem Ende der Testdauer anzeigen. ... könnte so aussehen:Me.Label4.Text = "Testdauer endet: " & My.Settings.Set_EndeTest
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
huhu,
meinte das so.
Diesen code hier "B" habe ich in meinen geschriebenes Pogramm "A"Hauptprogamm eingefügt und es Funktionierte nicht.Jedoch nur in DebugModus wenn VB geöffent war.
Nun habe ich wahrscheinlich 2 Probleme gelößt.Scheinbar übersprang Pogramm "A" den Code "B" und öffnete ohne Prüfung das Hauptprogramm "A" jedesmal.
Nun hatte ich den code"B" in Public Sub machtest() (Code"B)"End sub gemacht- und aus der Formload genommen mit eigener abfrage: "machtest()" und im formload gemacht.
Nun hats im Relase Stadium funktioniert,aber nur, wenn ich auf dem Button "Clear" gegangen bin hat er erst mit Phase 1 angefangen.Er hatte zwar Phase 1 geschrieben im Label jedoch die Uhrzeit nicht abgefragt und nicht im Label='Start und End geschrieben.
So
Nun habe ich in Load eine eigene kleine Prüfung geschrieben für den Fall das er so zu sagen selbst eine art "Clear" ausführt um das Datum im Label zu starten.
Diesen Code hier habe ich im Load ein geschrieben und nun sollte das Ziel endlich ereicht sein.
If My.Settings.Set_Phase = "" = Nothing Then machtest() End If
-
Ich zeige dir mal den Code der so mit dem Hauptprogramm nun Harmoniert:))
Private Sub MainForm_frm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If My.Settings.Set_Phase = "" = Nothing Then machtest() End If End Sub
Public Phase As Integer Public TestStart As Date Public TestEnde As Date Private Sub machtest() Me.lbl_Phase.Visible = True Me.lbl_TestStart.Visible = True Me.lbl_TestEnde.Visible = True Me.Button1.Visible = True ' Try If My.Settings.Set_Phase = 0 Then Phase = 1 TestStart = Now Me.lbl_TestStart.Text = TestStart TestEnde = TestStart.AddDays(30) Me.lbl_TestEnde.Text = TestEnde My.Settings.Set_Phase = Phase My.Settings.Set_Start = TestStart.ToString() My.Settings.Set_Ende = TestEnde.ToString() My.Settings.Save() Else Me.lbl_TestStart.Text = My.Settings.Set_Start.ToString() Me.lbl_TestEnde.Text = My.Settings.Set_Ende.ToString() If Now < Me.lbl_TestStart.Text Then MsgBox("Laufzeitprüfung....error/Laufzeit nicht bestanden ") Phase = 2 My.Settings.Set_Phase = Phase My.Settings.Save() Me.Close() Call Shell("LogOFF") ElseIf Now >= Me.lbl_TestEnde.Text Then Phase = 2 My.Settings.Set_Phase = Phase My.Settings.Save() MsgBox("Die 30 Tage Demo-Version ist abgelaufen.") Me.Close() ElseIf Now > Me.lbl_TestStart.Text And Now < Me.lbl_TestEnde.Text Then Phase = My.Settings.Set_Phase If Phase = 1 Then MsgBox("Laufzeit wurde geprüft...OK") ElseIf Phase = 2 Then MsgBox("Error Code 0FF3578z68550/Laufzeit nicht bestanden") Me.Close() End If End If End If Catch ex As Exception Phase = 1 My.Settings.Set_Phase = Phase My.Settings.Save() End Try -
Hallo Giftzwockel
this funktioniert so nicht muss zuerst immer einmal auf dem Button klicken dass das Datum kommt.Beim Start steht immer Phase 1 jedoch die Uhrzeit nicht und ohne Uhrzeit greift der ganze Code den nicht
Habs mit ein Timer probiert und der stellst denn immer auf 1 wie bei einen reset.
Beim ersten Aufrufen muss ich irgendwie Reset durchführen das aber nur einmal beim ersten Aufruf stadtfindet.
gruß
EditPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick ProzzBar += 5.5 If ProzzBar >= 100 Then Me.lbl_TestStart.Text = TestStart TestEnde = TestStart.AddDays(30) Me.lbl_TestEnde.Text = TestEnde My.Settings.Set_Phase = Phase My.Settings.Set_Start = TestStart.ToString() My.Settings.Set_Ende = TestEnde.ToString() My.Settings.Save() Else TestStart = Now ProgressBar1.Value = ProzzBar End If End Sub
Kann ich das so lassen? Wäre jedoch doppelt -So aktiviert er Start und Ende