Entwickler-Ecke
Basistechnologien - Prozess starten und nach Methodenaufruf wieder beenden
chip777 - Fr 16.04.10 14:55
Titel: Prozess starten und nach Methodenaufruf wieder beenden
Hi,
ich würde gerne eine Datei mit dem dazugehörigen Prozess öffnen, dass funktioniert mit folgendem Code auch super:
C#-Quelltext
1: 2: 3: 4: 5:
| System.Diagnostics.Process process = new System.Diagnostics.Process(); process.EnableRaisingEvents = false; process.StartInfo.FileName = (fullPathname); process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; process.Start(); |
Danach führe ich einen Methodenaufruf auf.
C#-Quelltext
1:
| oeffne_BFW(fullPathname); |
Jetzt würde ich den betreffenden Excel Prozess gerne wieder schließen, leider hab ich es bis jetzt nur hinbekommen, alle excel Prozesse zu schließen, das sieht dann so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| Process[] pp = Process.GetProcessesByName("excel"); foreach (Process p in pp) { p.CloseMainWindow(); } |
Wie kann ich die Prozess ID speichern und dann später über diese den Prozess beenden? Oder gibt es noch eine ganz andere Möglichkeit?
Moderiert von
Kha: Topic aus WinForms verschoben am Fr 16.04.2010 um 16:38
danielf - Fr 16.04.10 15:12
Hallo,
du musst dir das Erzeugte Process-Objekt merken.
C#-Quelltext
1: 2: 3: 4: 5:
| Process myExcelProcess = oeffne_BFW(fullPathname);
myExcelProcess.CloseMainWindow(); |
wobei
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public System.Diagnostics.Process oeffne_BFW(string path) { System.Diagnostics.Process process = new System.Diagnostics.Process(); process.EnableRaisingEvents = false; process.StartInfo.FileName = path; process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; process.Start(); return process; } |
norman2306 - Fr 16.04.10 15:16
Ich schätze mal, du definierst den Process erst in der Funktion? Definiere den Process als Klassenvariable, dann kannst du von überall zugreifen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public class MyApp { Process process = null;
private void StartProc(string fullPathname) { process = new Process(); process.EnableRaisingEvents = false; process.StartInfo.FileName = (fullPathname); process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; process.Start(); }
private void StopProc() { if(process != null) p.CloseMainWindow(); } } |
danielf - Fr 16.04.10 15:48
Das ist nicht so geschickt. Stell dir vor jemand ruft zweimal die StartProc-Methode auf. Schon verlierst du die Referenz auf das erste Objekt. Dann müsstest du also überprüfen ob der Prozess schon läuft und wieder Fehlerhandling einbauen... usw. Man sollte immer die notwendigen Parameter an eine Funktion übergeben und erstellte Objekte, wenn sie nach Ablauf der Methode noch benötigt werden zurück geben.
norman2306 - Fr 16.04.10 15:52
Jop, du hast recht. Schnellschuss:)
chip777 - Mo 19.04.10 07:31
Hi,
ich hab Daniels Idee mal versucht umzusetzen. Ich muss glaub ich aber mal noch was erklären, also das
C#-Quelltext
1:
| oeffne_BFW(fullPathname); |
Ist eine eigene Methode, die nichts mit dem Excel Prozess zu tun hat, die braucht einfach nur die Variable fullPathname und diese lädt dann ein Excel File in ein DataGridView.
Und deshalb klappt das mit dem Prozess schließen nicht so ganz wie du es bis jetzt beschrieben hast.
Vielleicht gibt es ja einfach eine Möglichkeit beim Starten des Prozesses, dessen ID auszulesen und den Prozess dann über die ID zu killen.
chip777 - Mo 19.04.10 07:55
Ich hab jetzt folgende Zeilen eingebaut:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| string id = System.Diagnostics.Process.GetProcessesByName("excel")[0].Id.ToString(); ... oeffne_BFW(fullPathname); ... int test = Convert.ToInt32(id); Process[] pp = Process.GetProcessById(id); foreach (Process p in pp) { p.CloseMainWindow(); p.Kill(); } |
Allerdings gibt der Compiler mir eine Fehlermeldung aus, Eine implizite Konvertierung vom Typ "System.Diagnostics.Process" in "System.Diagnostics.Process[]" ist nicht möglich..."
danielf - Mo 19.04.10 08:43
Das liegt daran, das eine ID eindeutig ist und die Funktion deshalb ein Process-Objekt zurück gibt. Anders als die Klasse GetProcessesByName welche du zuvor verwendet hast. Einen Namen gibt es mehrere.
Dein Code macht so aber wieder überhaupt keinen Sinn.. mal überlegt was er macht? und was du machen willst?
Versuch mit Kommentaren klar zu machen, was du da machst. Dabei meine ich nicht Kommentare wie:
C#-Quelltext
1: 2:
| int test = Convert.ToInt32(id); |
Sondern strukturierte Kommentare in der Form:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Process myExcelProcess = oeffne_BFW(fullPathname);
myExcelProcess.CloseMainWindow(); |
Also du solltest dir schon die Mühe machen, den Code zu verstehen. Den das was ich dir bereits hingeschrieben habe hat nichts mit dem zu tun was du wieder umgesetzt hast :/
chip777 - Mo 19.04.10 09:39
Im Moment reden wir leider etwas aneinander vorbei. Ich kann deinen Code nicht verwenden, weil er so nicht funktioniert. Das liegt aber an mir, weil ich mich nicht richtig ausgedrückt habe.
das
C#-Quelltext
1:
| oeffne_BFW(fullPathname) |
ist eine Methode die wie oben beschrieben ein DataGridView in eine Datei speichert. Das hat aber nichts mit dem Excel Prozess an sich zu tun.
das wäre also der //do something Teil meines Programmes.
Deshalb habe ich deinen Code nicht verwendet, ich habe zwar versucht ihn so anzupassen, dass es klappt, aber das bekomm ich leider nicht hin.
Ich weiß das das was ich geschrieben habe, nichts mit deiner Idee zu tun hatte, dass hab ich nur geschrieben, weil ich mit deiner Idee nicht zurecht gekommen bin und dachte das ich mit meiner vielleicht weiter komme. Da dem nicht so ist, würde ich dich ncohmal bitten, deinen Code so umzustellen das ich ihn benutzen kann, also das oeffne_BFW ist der do something Teil, und den Prozess müsste ich dann quasi anders nennen.
danielf - Mo 19.04.10 09:46
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Process myExcelProcess = OpenExcel(fullPathname);
oeffne_BFW(fullPathname);
myExcelProcess.CloseMainWindow();
public System.Diagnostics.Process OpenExcel(string path) { System.Diagnostics.Process process = new System.Diagnostics.Process(); process.EnableRaisingEvents = false; process.StartInfo.FileName = path; process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; process.Start(); return process; } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!