Announcement

Collapse
No announcement yet.

GetProcessByInstance(...) ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetProcessByInstance(...) ?

    Hi,

    da ich beim googeln nichts wirklich zufriedenstellendes ("elegantes") gefunden habe, hier die Frage:

    Wie kann ich aus einer Objekt-Instanz den zugehörigen Prozess ermitteln?

    In meinem Fall COM Interop, ich hole mir eine Excel-Instanz und hätte gerne den zugehörigen Prozess (bitte keine Antworten der Art get processes where name ="EXCEL" *g*)...

    this.Application = System.Activator.CreateInstance(Type.GetTypeFromPr ogID("Excel.Application"));

    ...im Moment nutze ich einen Workaround und meinen Prozess zu finden, den ich aber gerne entsorgen würde :-)

  • #2
    Klingt nach dem üblichen "wie kille ich den Excel Prozess weil über COM gehts nicht gescheit"

    Wenns das ist: Ich hab damals auch wie blöd gesucht und nicht wirklich eine brauchbare Lösung gefunden. Eine funktionierte dann aber gar nicht schlecht, die hab ich dann genommen.

    sowas in der Art wars:

    http://www.craigmurphy.com/blog/?p=82

    Ansonsten hier weiter suchen:

    http://www.google.de/search?sourceid...ss+com+interop

    Comment


    • #3
      ...Excel war eher ein Beispiel, würde mich interessieren, wie das Prinzipiell geht :-)

      ...in dem Beispiel schließe ich Excel ganz normal mit .Quit, was eigentlich immer geht. Als Sicherheit verssuche ich noch den Porzess zu killen, sofern ich ihn mit meinem Workaround ermitteln konnte.

      Mein Workaround zum Finden des Prozesses in diesem Fall ... nicht wirklich 'schön' funktioniert aber:

      IEnumerable<Process> excelProcessesBefore = from oneProcess in Process.GetProcesses().ToList<Process>() where oneProcess.ProcessName == excelProcessTitle select oneProcess;
      Application = System.Activator.CreateInstance(Type.GetTypeFromPr ogID("Excel.Application"));
      IEnumerable<Process> excelProcessesAfter = from oneProcess in Process.GetProcesses().ToList<Process>() where oneProcess.ProcessName == excelProcessTitle select oneProcess;
      IEnumerable<Process> excelProcessesDelta = from oneProcess in excelProcessesAfter.Except<Process>(excelProcesses Before) select oneProcess;
      ExcelProcess = (excelProcessesDelta.Count() == 1) ? excelProcessesDelta.First<Process>() : null; // Workaround für "GetProcessByInstance(...)"

      .
      .
      .

      try { ExcelProcess.Kill(); }
      catch (Exception) { }

      Comment


      • #4
        ...Excel war eher ein Beispiel, würde mich interessieren, wie das Prinzipiell geht :-)
        Vermutlich gibt es keine prinzipielle Lösung. Durch Type.GetTypeFromProgID muss ja nicht zwingend ein neuer Prozess erzeugt worden sein. Könnte ja auch ein COMServer sein der in deinem eigen Prozess läuft.

        Insofern sollte die bereitgestellten Methoden des COM Typs (wie zum Beispiel Quit bei Excel) den passenden Prozess beenden wenn es den einen gibt. Bei den MS Office Anwendungen funktioniert das halt nur nicht immer richtig im Zusammenspiel mit dem GC von .Net. Es ist also ein spezielles Office Problem. Und spezielle Probleme haben selten prinzipielle Lösungen

        Comment

        Working...
        X