Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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 user profile iconmatze: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Titel geändert.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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? :shock: 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 Suche in: Delphi-Forum, Delphi-Library ONEINST an.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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? :mrgreen:

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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 28.01.09 19:05 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Ja auf das mit der Batch kam ich eben auch, hat bis jetzt noch nicht geklappt
Du musst eine Schleife in der Batchdatei machen. Wenn die Datei existiert wieder zurückspringen vor den Löschbefehl. Dann läuft das so lange bis das Programm beendet ist und es die Datei löschen konnte. ;-)
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 19.03.09 19:40 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
@jaennicke : Wie geht das mit der Schleife, habe mit Batch Dateien keine großen Erfahrungen.
Naja eine schleife...
ausblenden Quelltext
1:
2:
3:
:schleife
del asd.exe
if exist asd.exe goto schleife
So vielleicht? :mrgreen:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.03.09 18:36 
Die Pfadangabe ist falsch...
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.03.09 18:48 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.03.09 19:14 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
  ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), nilnil, SW_SHOWNORMAL);					
Richtig wäre es so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Fr 20.03.09 19:32 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
  ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'test.bat'), nilnil, SW_SHOWNORMAL);					
Richtig wäre es so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.03.09 20:09 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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.