Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mi 28.01.09 17:54
Ich möchte dass mein Programm nur einmal ausgeführt werden kann, also kein Kopierschutz.
Die Anwendung soll am besten beim OnClose gelöscht werden, den Pfad für den Ordner bekomme ich mit ExtractFilePath(ParamStr(0));.
Dann muss ich ja nur noch den Dateinamen anhängen, und dann irgendwie löschen.
Doch wie kann ich die Datei am besten löschen?
Ich habe gesucht, aber nichts brauchbares gefunden.
PS: Mit Deletefile hat es nicht funktioniert.
Moderiert von matze: Delphi-Tags hinzugefügt
Moderiert von Narses: Titel geändert.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 17:57
Moment moment. Du willst, dass dein Programm nur einmal ausgeführt wird, und wenn der User es wagen sollte, es zweimal auszuführen, möchtest du das Programm von der Festplatte löschen?  Ich glaube, du verstehst da was falsch ...
Edit: Klar dass DeleteFile nicht funktioniert: Ein laufendes Programm zu löschen sollte eigentlich nicht drin sein
Ich vermute mal, dass du nur willst, dass eine zweite Instanz des Programms wieder geschlossen wird. Schau dir dazu ONEINST an.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mi 28.01.09 18:00
Nein, es ist ja nur eine Programmdatei, das hauptsächliche ist ja noch da.
Also einen Lösungsvorschlag?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 18:04
Also wenn du wirklich dein Programm von der Platte löschen möchtest (Die Exe-Datei die gerade läuft), dann musst du das tun, nachdem dein Programm beendet wurde. Das kannst du erreichen, indem du eine Bat-datei erstellst mit del meinprogram.exe und diese ausführst, bevor du dein programm dann beendest. Aber warum um in aller Welt willst du das tun?
Edit: Ah nun verstehe ich. Du willst, dass dein Programm auf einem Rechner nur einmal (nicht einmal *gleichzeitig*, sondern tatsächlich nur 1 mal) ausgeführt werden kann. Das mit dem Löschen ist zwar eine Idee, aber wenn ich das Programm dann einfach nochmal runterlade, dann kann ich es ja wieder starten.
Man könnte einen Registry-Eintrag schreiben, der ein erneutes Starten nicht erlaubt (vor Application.CreateForm dann abfragen ob dieser gesetzt ist), was aber unschön ist, da dir solch Programmierstil auf dauer die Registry zumüllt.
Man könnte eine Datei im Anwendungsdatenverzeichnis ablegen, was aber auf's gleiche hinauskommt. Mehr fällt mir nicht ein... 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mi 28.01.09 18:11
Ja auf das mit der Batch kam ich eben auch, hat bis jetzt noch nicht geklappt.
Das mit der Registry möchte ich auch nicht, am System soll nicht rumgefummelt werden.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.01.09 19:05
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 28.01.09 20:39
das klingt alles grausam.
Willst du einen Virus programmieren
Welch Zweck sollte das wohl haben?
Egal:
erstelle beim Programstart (wenn ohne Parameter) eine Batch-Datei
Rufe die Batchdatei via ShellExecute auf und verlasse dein Program
diese Batchdatei ruft dein Program auf (mit Parameter)
Programm startet (mit Parameter) und läuft
z.b. MeinProg.Exe
c:>\meinprog.exe
programm stellt fest, dass es ohne Parameter gestartet wurde und erstellt eine Batch-Datei welche enthalt
@echo off
meinprog.exe geheimerParameter
delete meinprog.exe
und ruft anschließend die Batchdatei auf und beendet sich.
:-)msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 19.03.09 19:30
@jaennicke : Wie geht das mit der Schleife, habe mit Batch Dateien keine großen Erfahrungen.
@MSCH: Nein ich will keinen Virus machen, weis garnet wieso du mir das jetzt unterstellst.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 19.03.09 19:40
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 20.03.09 18:08
Das mit goto kannte ich ja, aber das mit if exist nicht.
Danke werde es ausprobieren.
Edit: Funktioniert nicht wie gewünscht, es schreibt den Befehl immer weiter, aber die Datei wird nicht gelöscht.
Quelltext 1: 2: 3: 4:
| :schleife del C:\Dokumente und Einstellungen\Anwender\Desktop\test\Project2.exe if exist Project2.exe goto schleife exit |
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.03.09 18:36
Die Pfadangabe ist falsch... Quelltext 1:
| del "C:\Dokumente und Einstellungen\Anwender\Desktop\test\Project2.exe" | Und wenn die nötig wäre, warum fehlt die dann bei dem exist?
Wenn du die Batchdatei mit dem richtigen Verzeichnis als Arbeitsverzeichnis startest, dann kannst du dir die Pfadangabe auch sparen...
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 20.03.09 18:43
Achso die wird ja im selben Verzeichnis wie die Anwendung erstellt, dann geht es auch ohne Pfad.
Edit: Jetzt funktioniert es. Danke für die Hilfestellungen. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.03.09 18:48
Dude566 hat folgendes geschrieben : | Achso die wird ja im selben Verzeichnis wie die Anwendung erstellt, dann geht es auch ohne Pfad. |
In der Batchdatei ja, beim Aufruf der Batchdatei z,B. mit ShellExecute darf die Angabe des Arbeitsverzeichnisses nicht fehlen.
Sonst muss man deine Exe nur mit einem anderen Arbeitsverzeichnis starten und schon funktioniert das nicht mehr, weil AFAIR dann das Arbeitsverzeichnis der startenden Exe benutzt wird.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 20.03.09 19:02
Ja das ist schon klar, das sie beide im selben Verzeichnis sein müssen wenn die Batch die Exe löschen soll.
Das Ausführen der Batch erfolgt aber nicht mit einer genauen Pfadangabe, habe lediglich den Dateinamen der Batch angegeben.
Reicht völlig aus solange beide im gleichen Verzeichnis sind.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.03.09 19:14
Dude566 hat folgendes geschrieben : | Ja das ist schon klar, das sie beide im selben Verzeichnis sein müssen wenn die Batch die Exe löschen soll. |
Stimmt nicht, es kommt nur auf das Arbeitsverzeichnis an. Die Batchdatei kann auch im Verzeichnis für temporäre Dateien liegen, das ist vollkommen egal.
Aber das Arbeitsverzeichnis musst du wie gesagt bei ShellExecute auch übergeben. So ist es z.B. falsch und geht nicht bzw. nur durch den Zufall, dass das Arbeitsverzeichnis das Verzeichnis deiner eigenen Exe ist: Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), nil, nil, SW_SHOWNORMAL); | Richtig wäre es so: Delphi-Quelltext 1: 2:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), '', PChar(ExtractFilePath(ParamStr(0))), SW_SHOWNORMAL); | Und wenn du deine Batchdatei ins Verzeichnis für temporäre Dateien legst und das Arbeitsverzeichnis auf das deiner Exe setzt, dann funktioniert das trotzdem ohne Pfadangabe in der Batchdatei.
Es ist wichtig, dass du dir das klar machst was passiert, wenn du kein Verzeichnis angibst. Dabei ist es egal ob es eine Batchdatei oder dein Delphiprogramm ist...
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 20.03.09 19:32
jaenicke hat folgendes geschrieben : | Dude566 hat folgendes geschrieben : | Ja das ist schon klar, das sie beide im selben Verzeichnis sein müssen wenn die Batch die Exe löschen soll. | Stimmt nicht, es kommt nur auf das Arbeitsverzeichnis an. Die Batchdatei kann auch im Verzeichnis für temporäre Dateien liegen, das ist vollkommen egal.
Wenn das so wäre müsste ich ja bei Shellexecute wieder den ganzen Pfad eintragen.
Aber das Arbeitsverzeichnis musst du wie gesagt bei ShellExecute auch übergeben. So ist es z.B. falsch und geht nicht bzw. nur durch den Zufall, dass das Arbeitsverzeichnis das Verzeichnis deiner eigenen Exe ist: Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), nil, nil, SW_SHOWNORMAL); | Richtig wäre es so: Delphi-Quelltext 1: 2:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), '', PChar(ExtractFilePath(ParamStr(0))), SW_SHOWNORMAL); | Und wenn du deine Batchdatei ins Verzeichnis für temporäre Dateien legst und das Arbeitsverzeichnis auf das deiner Exe setzt, dann funktioniert das trotzdem ohne Pfadangabe in der Batchdatei.
Es ist wichtig, dass du dir das klar machst was passiert, wenn du kein Verzeichnis angibst. Dabei ist es egal ob es eine Batchdatei oder dein Delphiprogramm ist... |
Das Arbeitsverzeichnis ist aber bei mir bisher immer das gleiche gewesen wie auch das wo die Exe liegt, da die Batch Datei im selben Verzeichnis erstellt wird und auch sofort ausgeführt wird.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.03.09 20:09
Dude566 hat folgendes geschrieben : | Das Arbeitsverzeichnis ist aber bei mir bisher immer das gleiche gewesen wie auch das wo die Exe liegt, da die Batch Datei im selben Verzeichnis erstellt wird und auch sofort ausgeführt wird. |
Und sobald man in der Verknüpfung zu deiner Exe ein anderes angibst, ist es ein anderes.
Und sobald du einen Öffnen- oder Speichern-Dialog anzeigst, ist es ein anderes, nämlich das im Dialog ausgewählte.
Und wenn es irgendwo explizit mit SetCurrentDir geändert wird, ist es ein anderes.
...
Du kannst dir ja die Demo anschauen, in der Demo zeige ich nur einen Öffnen-Dialog an, und schon klappt das mit dem Arbeitsverzeichnis nicht mehr...
www.delphi-library.d...ewtopic.php?p=499701
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 21.03.09 12:59
Die Auswahl hat der Anwender ja garnicht.
PS: Danke für den Link, ich verstehe schon was du meinst aber der Pfad kann nun mal nicht im Programm geändert werden.
EDIT:
Habs jetzt doch mit ExtractFilePath noch gemacht, damit auch wirklich kein Fehler in einem dummen Zufall auftreten kann.
Hast ja recht. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Sa 21.03.09 15:12
Noch ein Hinweis am Schluss: Lösch doch bitte in der Batch Datei auch die Batch Datei selber.
Sonst fliegt immer noch so ein blödes Bat File auf der Platte rum...
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 21.03.09 15:20
Kann die Datei sich selber löschen?
Gibt es da ein extra Befehl, oder mit dem normalen Del?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
|