Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie kann geprüft werden ob ShellExecute (https://www.delphipraxis.net/188778-wie-kann-geprueft-werden-ob-shellexecute.html)

HPB 6. Apr 2016 17:29

Wie kann geprüft werden ob ShellExecute
 
Guten Tag Delphianer,
ich schreibe eine Datei mit TFileStream auf die Platte.
Dies gelingt auch gut.
Danach öffne ich die Datei mit ShellExecute.
Das gelingt auch.
Nach dem ich Datei anzeigt und geschlossen habe, möchte ich sie wieder löschen.

Mit diesem Code wird nicht mal das Bild angezeigt:
Delphi-Quellcode:
   
pSchreibeStream := TFileStream.Create(pSchreibeDatei, fmCreate);
    dtmdMain.dokumenteDOKUMENT.SaveToStream(pSchreibeStream);
pSchreibeStream.Free;

   ShellExecute(Handle, 'open', PChar(pSchreibeDatei),
      nil, nil, SW_SHOWNORMAL);
  DeleteFile(pSchreibeDatei);
Wenn ich die Zeile: DeleteFile(pSchreibeDatei); Enable dann wird die Datei angezeigt.
Aber wann kann ich sie wieder von der Platte löschen?


Mit Gruß HPB

DeddyH 6. Apr 2016 17:52

AW: Wie kann geprüft werden ob ShellExecute
 
Es gibt zig Implementierungen von ExecAndWait, eine davon kann man sicherlich benutzen.

hoika 6. Apr 2016 17:59

AW: Wie kann geprüft werden ob ShellExecute
 
Hallo,
die Implementierungen verwenden entweder ShellExecuteEx oder CreateProcess/WaitUntil...


Heiko

himitsu 7. Apr 2016 11:46

AW: Wie kann geprüft werden ob ShellExecute
 
"Wie kann geprüft werden ob ShellExecute" es richtig gemacht hat?
Indem man den Rückgabewert von SchellExecute prüft, so wie man das bei allen APIs/Funktionen machen sollte?

"Wie kann geprüft werden ob ShellExecute das gestartete Programm" fertig/bendet ist?
Indem man schaut ob das Programm noch läuft
* z.B. über die ToolsAPI nach der EXE/Instanz suchen
* nach dem Fenster der Anwendung suchen
* CreateProcess benutzen und das Prozess-Handle prüfen
* ...

Zacherl 7. Apr 2016 12:11

AW: Wie kann geprüft werden ob ShellExecute
 
Zitat:

Zitat von himitsu (Beitrag 1334896)
* z.B. über die ToolsAPI nach der EXE/Instanz suchen
* nach dem Fenster der Anwendung suchen
* CreateProcess benutzen und das Prozess-Handle prüfen
* ...

Dann aber wirklich lieber MSDN-Library durchsuchenCreateProcess bzw. MSDN-Library durchsuchenShellExecuteEx mit anschließendem MSDN-Library durchsuchenWaitForSingleObject. Nach dem Fenster oder dem Prozess zu suchen ist meiner Meinung nach nicht ideal. Ist erstens viel aufwändiger und zweitens recht fehleranfällig (was, wenn der User zwei Adobe Reader Instanzen geöffnet hat?, etc.).

himitsu 7. Apr 2016 12:25

AW: Wie kann geprüft werden ob ShellExecute
 
Und was ist mit SingleInstanz-Anwendungen.
> Dein Gestartetes beendet sich wieder und ein anderer Prozess arbeitet dafür weiter.

Aber ja, grundsätzlich gebe ich dir Recht.

pesi 7. Apr 2016 12:30

AW: Wie kann geprüft werden ob ShellExecute
 
Was mich viel mehr verwirrt bzw. was Deine ganz Vorgehensweise in den meisten Fälle scheitern lässt ist aber doch auch die Tatsache, dass eine Datei die gerade geöffnet ist i.d.R. von Windows nicht gelöscht werden kann! Das Löschen der Datei solange sie noch läuft (wenn es eine EXE ist) bzw. geöffnet ist (z.B. wenn es ein Excel-Document ist) muss meiner Meinung nach scheitern!
.....aber das wäre ja dann erst der nächste Fehler der bei Dir auftauche müsste, oder seht Ihr das anders???

himitsu 7. Apr 2016 12:36

AW: Wie kann geprüft werden ob ShellExecute
 
Darum will er ja warten, bis das Programm wieder beendet wurde. :zwinker:

Alternativ kann man auch Windows etwas löschen lassen.
> Delete on rebot
Dann löscht Windows das beim nächsten Windows-Start/Neustart.

pesi 7. Apr 2016 12:38

AW: Wie kann geprüft werden ob ShellExecute
 
MIST.... wer lesen kann ist klar im Vorteil :( :roll:

Neutral General 7. Apr 2016 13:30

AW: Wie kann geprüft werden ob ShellExecute
 
Zitat:

Zitat von pesi (Beitrag 1334904)
Was mich viel mehr verwirrt bzw. was Deine ganz Vorgehensweise in den meisten Fälle scheitern lässt ist aber doch auch die Tatsache, dass eine Datei die gerade geöffnet ist i.d.R. von Windows nicht gelöscht werden kann!

Das kommt drauf an wie die Datei geöffnet wurde. Wenn die Datei mit FILE_SHARE_DELETE geöffnet wurde, kann man sie auch löschen wenn sie vom anderen Programm noch geöffnet ist.
Außerdem lassen die meisten Anwendungen das File-Handle auch nicht geöffnet nachdem sie die Datei eingelesen haben und dann ist die Datei auch löschbar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz