Prozess erkennen und beenden

Antworten
pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Prozess erkennen und beenden

Beitrag von pascalts »

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

marcov
Beiträge: 1100
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

Beitrag von marcov »

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.

Socke
Lazarusforum e. V.
Beiträge: 3158
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

Beitrag von Socke »

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.

Wenn 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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Prozess erkennen und beenden

Beitrag von pascalts »

Wenn 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.


Ich greife über OLE zu: http://wiki.lazarus.freepascal.org/WordAutomation/de

Patito
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

Beitrag von Patito »

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.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Prozess erkennen und beenden

Beitrag von pascalts »

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.


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.

mschnell
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

Beitrag von mschnell »

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.

Eine Datei kann auch von einem anderen (z.B. Netzwerk-) User geöffnet sein. Da kannst Du nix machen.

-Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Prozess erkennen und beenden

Beitrag von wp_xyz »

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.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Prozess erkennen und beenden

Beitrag von pascalts »

wp_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.


Mein Programm öffnet eine Datei (eine Vorlage, Word Dokument), editiert diese Datei, und speichert sie unter einem neuen Name. Probleme stellen sich dar, wenn
-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!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Prozess erkennen und beenden

Beitrag von wp_xyz »

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.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Prozess erkennen und beenden

Beitrag von Warf »

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

mark332
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

Beitrag von mark332 »

Warf 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


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ält ;)

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] ?

Christian
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

Beitrag von Christian »

In meiner Utils
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/

gocher
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

Beitrag von gocher »

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;

Unter Umständen laufen allerdings auch mehrere Instanzen von Word. Für den Fall könnte man GetActiveOleObject in eine Schleife packen und so alle aktiven Instanzen schließen.

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

Antworten