Prozess erkennen und beenden
Prozess erkennen und beenden
Guten Morgen!
Mein Programm kommuniziert mit Word und Excel. Deswegen ist es essentiell wichtig, dass keine Word-Dateien geöffnet sind, bevor ich einen Teilprozess starte.
Wie kann ich (unter Windows) feststellen, ob ein Programm / Prozess mit dem Name "WINWORD.EXE" gestartet wurde? Ich möchte dem Nutzer dann Gelegenheit geben, seine Arbeit zu speichern und Word selbst zu beenden.
In seltenen Fällen läuft Word im Hintergund und wird nicht grafisch angezeigt. In diesem Fall würde ich gern den Prozess killen. Ist dies möglich?
MfG Pascal
Mein Programm kommuniziert mit Word und Excel. Deswegen ist es essentiell wichtig, dass keine Word-Dateien geöffnet sind, bevor ich einen Teilprozess starte.
Wie kann ich (unter Windows) feststellen, ob ein Programm / Prozess mit dem Name "WINWORD.EXE" gestartet wurde? Ich möchte dem Nutzer dann Gelegenheit geben, seine Arbeit zu speichern und Word selbst zu beenden.
In seltenen Fällen läuft Word im Hintergund und wird nicht grafisch angezeigt. In diesem Fall würde ich gern den Prozess killen. Ist dies möglich?
MfG Pascal
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Prozess erkennen und beenden
Ja, via der Prozess Api.
Das sind normale Windows API Calls, und dafuer sollte es Windows und auch schon Lazarus beispiele geben. Glaube das auch Jedi JCL da etwas mit macht.
Typisch werden process32first und -next oder enumprocesess genutzt.
Das sind normale Windows API Calls, und dafuer sollte es Windows und auch schon Lazarus beispiele geben. Glaube das auch Jedi JCL da etwas mit macht.
Typisch werden process32first und -next oder enumprocesess genutzt.
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Prozess erkennen und beenden
Wenn du über die COM-Schnittstelle arbeitest, kannst du darüber abfragen, ob Dateien geöffnet sind.pascalts hat geschrieben:Mein Programm kommuniziert mit Word und Excel. Deswegen ist es essentiell wichtig, dass keine Word-Dateien geöffnet sind, bevor ich einen Teilprozess starte.
Hier hast du sowieso Zugriff auf das Excel-/Word-Anwendungsobjekt und kannst es darüber auch beenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Prozess erkennen und beenden
Ich greife über OLE zu: http://wiki.lazarus.freepascal.org/WordAutomation/deWenn du über die COM-Schnittstelle arbeitest, kannst du darüber abfragen, ob Dateien geöffnet sind.
Hier hast du sowieso Zugriff auf das Excel-/Word-Anwendungsobjekt und kannst es darüber auch beenden.
-
- Beiträge: 203
- Registriert: Di 22. Sep 2009, 13:08
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Prozess erkennen und beenden
Vielleicht musst Du den anderen Prozess auch gar nicht beenden.
Als ich mal Word mit OLE verwendet habe, konnte ich irgendwo per Parameter angeben,
dass ich für meine Aktionen einen eigenen Prozess haben will.
Als ich mal Word mit OLE verwendet habe, konnte ich irgendwo per Parameter angeben,
dass ich für meine Aktionen einen eigenen Prozess haben will.
Re: Prozess erkennen und beenden
Mein Problem ist, dass eventuell die Datei, in die ich speichern will, schon in Word geöffnet ist (überschreiben dann nicht möglich) oder die Vorlage die ich verwende schon geöffnet ist... Diese beiden Zustände gilt es zu vermeiden.Patito hat geschrieben:Vielleicht musst Du den anderen Prozess auch gar nicht beenden.
Als ich mal Word mit OLE verwendet habe, konnte ich irgendwo per Parameter angeben,
dass ich für meine Aktionen einen eigenen Prozess haben will.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Prozess erkennen und beenden
Eine Datei kann auch von einem anderen (z.B. Netzwerk-) User geöffnet sein. Da kannst Du nix machen.pascalts hat geschrieben:Mein Problem ist, dass eventuell die Datei, in die ich speichern will, schon in Word geöffnet ist (überschreiben dann nicht möglich) oder die Vorlage die ich verwende schon geöffnet ist... Diese beiden Zustände gilt es zu vermeiden.
-Michael
Re: Prozess erkennen und beenden
Was willst du denn eigentlich machen? Vielleicht geht das ja auch mit Bordmitteln. Eine anderes Programm abzuschießen, ist immer eine unsaubere Lösung, das wirst du spätestens merken, wenn nicht gespeicherte Änderungen verloren gehen.
Re: Prozess erkennen und beenden
Mein Programm öffnet eine Datei (eine Vorlage, Word Dokument), editiert diese Datei, und speichert sie unter einem neuen Name. Probleme stellen sich dar, wennwp_xyz hat geschrieben:Was willst du denn eigentlich machen? Vielleicht geht das ja auch mit Bordmitteln. Eine anderes Programm abzuschießen, ist immer eine unsaubere Lösung, das wirst du spätestens merken, wenn nicht gespeicherte Änderungen verloren gehen.
-Die Vorlage (warum auch immer) geöffnet ist
-Die Zieldatei (welche in einigen Fällen aktualisiert also überschrieben wird) geöffnet ist
Einfachste Lösung meiner Meinung nach: Den User auffordern, Word zu schließen, falls es offen ist. Deswegen möchte ich dedektieren, ob ein Word-Prozess läuft. Außerdem (aber eher Bonus) möchte ich diesen Word-Prozess, falls vorhanden, killen können. Hintergrund hier ist, dass wir andere Programme einsetzen, die Word im Hintergrund (also ohne GUI) starten, und gern mal hängen bleiben oder anderweitig gecancelt werden. Word bleibt dann im Hintergrund offen - und blockiert stellenweise mein Programm.
Grüße!
Re: Prozess erkennen und beenden
Es kommt drauf an, was du an den Word-Dateien ändern möchtest. Hast du schon einmal daran gedacht, die Dateien direkt zu bearbeiten? Seit Office 2007 sind das nur noch gezippte xml-Dateien, kleine Änderungen kann man durchaus selbst anbringen. Oder mit fpvectorial (in Lazaraus/Components/fpvectorial) kannst du einfache docx-Dateien unabhängig von Word erzeugen.
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Prozess erkennen und beenden
Einfach Prozesse zu killen ist sowieso schonmal der Falsche Ansatz, stell dir mal vor du hast im Hintergrund grade Word offen, und schreibst an einem Dokument, welches komplett unabhängig von dem ist womit dein Programm arbeitet, und dann killt dein Programm Word einfach so. Also ich wäre da verdammt genervt wenn einfach irgendwelche Prozesse gekilled würden.
Was du eher versuchen solltest ist rauszufinden ob das Dokument welches dein Programm benutzt derzeit in Benutzung ist
Was du eher versuchen solltest ist rauszufinden ob das Dokument welches dein Programm benutzt derzeit in Benutzung ist
-
- Beiträge: 202
- Registriert: Do 16. Mai 2013, 13:49
- OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
- CPU-Target: AMD Octacore 4.0GHz
Re: Prozess erkennen und beenden
Ich denke mal, dass er eine Nutzerinteraktion meint, die erst den Kill auslöst, zum Beispiel einen Button "Zum Schließen zwingen" zumal Word bei ungespeicherten Dokumenten ja sogar den Shutdown von Windows aufhältWarf hat geschrieben:Einfach Prozesse zu killen ist sowieso schonmal der Falsche Ansatz, stell dir mal vor du hast im Hintergrund grade Word offen, und schreibst an einem Dokument, welches komplett unabhängig von dem ist womit dein Programm arbeitet, und dann killt dein Programm Word einfach so. Also ich wäre da verdammt genervt wenn einfach irgendwelche Prozesse gekilled würden.
Was du eher versuchen solltest ist rauszufinden ob das Dokument welches dein Programm benutzt derzeit in Benutzung ist

Und wenn andere Programme den Word-Prozess im Hintergrund öffnen bleibt auch nicht viel übrig als terminieren, esseidenn, man kann Word im Nachhinein anweisen, sich im Vordergrund zu zeigen (falls diese Backgroundprozesse überhaupt über ein GUI verfügen)
MfG
mark332
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Prozess erkennen und beenden
In meiner Utils
https://github.com/cutec-chris/general/ ... /Utils.pas
Gibtes eine IsFileOpen Funktion, die macht genau das.
https://github.com/cutec-chris/general/ ... /Utils.pas
Gibtes eine IsFileOpen Funktion, die macht genau das.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: Prozess erkennen und beenden
Code: Alles auswählen
uses Variants, ComObj, ActiveX;
...
var
Word: Variant;
begin
try
Word := GetActiveOleObject('Word.Application');
ShowMessage('Word is open!');
Word.Quit;
Word := Unassigned;
except
ShowMessage('Word not open !');
Exit;
end;
end;
Vermutlich erzeugst Du die Instanzen im Hintergrund selbst wenn du mit Ole-Automatisierung auf Word zugreifst.
Um das zu verhindern würde ich den Zugriff auf Word wie folgt aufbauen:
Code: Alles auswählen
try
Word := GetActiveOleObject('Word.Application'); // nimmt sich falls vorhanden die Instanz
except on exception do
Word := CreateOleObject('Word.Application'); // erzeugt eine Instanz da keine existiert
end;
try
... // deine Automatisierung
finally
Word.Quit;
Word := Unassigned;
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me