Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfedatei temporär erstellen und wieder löschen (https://www.delphipraxis.net/180675-hilfedatei-temporaer-erstellen-und-wieder-loeschen.html)

devidespe 6. Jun 2014 20:34

Hilfedatei temporär erstellen und wieder löschen
 
Hallo,

während meiner Programminitialisierung erstelle ich eine relativ kleine Hilfedatei im temporären Verzeichnis (Umgebungsvariable TEMP) und weise den Pfad zu Application.Helpfile zu. Das funktioniert soweit ganz gut.

Kurz vor dem Programmende lösche ich diese Datei wieder mittels DeleteFile, das funktioniert auch. Allerdings funktioniert es nicht, wenn ich die Hilfedatei mindestens einmal in der Applikation angezeigt habe, also der Anwender min. einmal F1 gedrückt hat. Ich vermute, die Applikation öffnet die Datei dann und schließt sie irgendwann zum Ende, so dass mein Löschvorgang auf die Datei nicht wirken kann.

Was kann man da tun?

Pfaffe 6. Jun 2014 21:23

AW: Hilfedatei temporär erstellen und wieder löschen
 
Wahrscheinlich mußt Du die Hilfedatei mit Application.HelpCommand(HELP_QUIT, 0) vor dem löschen schließen.

devidespe 6. Jun 2014 21:30

AW: Hilfedatei temporär erstellen und wieder löschen
 
Die Hilfe, wenn sie denn offen ist, wird durch den Befehl geschlossen. Der anschließende Löschvorgang scheitert aber trotzdem...

himitsu 6. Jun 2014 21:34

AW: Hilfedatei temporär erstellen und wieder löschen
 
Zitat:

Zitat von Die OH sagt ...
Before closing the window that requested help, the application must call WinHelp with the uCommand parameter set to HELP_QUIT. Until all applications have done this, Windows Help will not terminate. Note that calling Windows Help with the HELP_QUIT command is not necessary if you used the HELP_CONTEXTPOPUP command to start Windows Help.


Wie erstellst du denn die Datei?

Wenn man dafür FILE_ATTRIBUTE_TEMPORARY (MSDN-Library durchsuchenCreateFile) verwendet, dann löscht Windows die Datei automatisch, selbst wenn dein Progamm abstürzt.
In wie weit FILE_FLAG_DELETE_ON_CLOSE helfen könnte, kann ich jetzt nicht sagen.



Alternativ gäbe es auch andere Hilfesysteme, als diese HLP-Dateien.

Warum erstellst du diese Datei eigentlich erst zur Laufzeit?

devidespe 6. Jun 2014 21:49

AW: Hilfedatei temporär erstellen und wieder löschen
 
Ich erstelle die Datei zur Laufzeit, weil ich sie dabei haben möchte, dem Kunden aber keine zusätzliche Datei mitgeben möchte.

Die Datei liegt in einem internen Array als Ressource vor und wird mittels Rewrite und Blickwrite erstellt. Vielleicht sollte ich zu Createfile umschwenken...

himitsu 6. Jun 2014 22:24

AW: Hilfedatei temporär erstellen und wieder löschen
 
Du kannst ja einfach mal probieren, ob sich diese Datei auch direkt aus den Resourcen laden lässt,

http://msdn.microsoft.com/en-us/libr...loband%29.aspx

Luckie 8. Jun 2014 04:56

AW: Hilfedatei temporär erstellen und wieder löschen
 
Also ich würde die Anwendung in einer Zip-Datei verteilen oder aber die Hilfe-Datei aus der Ressource extrahieren und nicht wieder löschen. Also nur extrahierten, wenn sie nicht gefunden wird. Alles andere ist irgendwie - komisch. :?

devidespe 8. Jun 2014 15:04

AW: Hilfedatei temporär erstellen und wieder löschen
 
Zitat:

Zitat von himitsu (Beitrag 1261653)
Wie erstellst du denn die Datei?

Wenn man dafür FILE_ATTRIBUTE_TEMPORARY (MSDN-Library durchsuchenCreateFile) verwendet, dann löscht Windows die Datei automatisch, selbst wenn dein Progamm abstürzt.
In wie weit FILE_FLAG_DELETE_ON_CLOSE helfen könnte, kann ich jetzt nicht sagen.

Alternativ gäbe es auch andere Hilfesysteme, als diese HLP-Dateien.

So ich habe die Dateierstellung auf CreateFile umgeschrieben, auch in Verbindung mit FILE_ATTRIBUTE_TEMPORARY und FILE_FLAG_DELETE_ON_CLOSE. Ersteres hat leider keinen Einfluss, die Datei lässt sich nachwievor nicht löschen. Bei FILE_FLAG_DELETE_ON_CLOSE wird die Datei garnicht erst erstellt und ich kann die Hilfe nicht laden. Das passiert folgendermaßen:

Delphi-Quellcode:
FHandle:=CreateFile(PChar(Filename),
                        GENERIC_WRITE,
                        0,
                        nil,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_TEMPORARY,
                        0);
Sicher gibt es andere Hilfesysteme, ich habe nun aber alles auf diese CHM-Datei ausgerichtet und dachte, ein einfacher Löschvorgang wäre nicht problematisch. Leider doch...

himitsu 8. Jun 2014 16:16

AW: Hilfedatei temporär erstellen und wieder löschen
 
Ja, nicht du löschst diese Datai. :zwinker:

Du beendest einfach dein Programm und wenn alle Programme, auch das WinHelp, die Datei freigegeben haben, dann räumt Windows auf. :zwinker:
Also nicht vergessen dein FileHandle offen zu lassen, bis zum Programmende. (da WinHelp die Datei ja anfangs noch nicht offen hat)


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

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