title: Running Object Table, get Object back by a special Process Id
body: <p>I have some trouble. I want to start Processes with C# (The goal is to start several applications of a special Document in the background). Now this is done by me, I start the Program as a invisible Process, but I want to direct the application through my code. So, I want to have a object back (the object with a special Process-ID), which is lying on the Running Object Table. I don't can solve this, because I am getting always the first application back.</p>
  
  <pre><code>public static Application GetRunningCOMObjectByProcessId(int id)
          {
              // ROT-Schnittstelle
              IRunningObjectTable runningObjectTable = null;
  
              // Moniker-Auflistung
              IEnumMoniker monikerList = null;
  
              try
              {
                  // Running Object Table abfragen und nichts zurückgeben, wenn keine COM-Objekte laufen
                  if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null;
  
                  // Moniker abfragen
                  runningObjectTable.EnumRunning(out monikerList);
  
  
                  // An den Anfang der Auflistung springen
                  monikerList.Reset();
  
                  // Array für Moniker-Abfrage erzeugen
                  IMoniker[] monikerContainer = new IMoniker[1];
  
                  // Zeiger auf die Anzahl der tatsächlich abgefragten Moniker erzeugen
                  IntPtr pointerFetchedMonikers = IntPtr.Zero;
  
                  // Alle Moniker durchlaufen
                  while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
                  {
                      // Objekt für Bindungsinformationen
                      IBindCtx bindInfo;
  
                      // Variable für den Anzeigenamen des aktuellen COM-Objekts
                      string displayName;
  
                      // Bindungsobjekt erzeugen
                      CreateBindCtx(0, out bindInfo);
  
                      // Anzeigename des COM-Objekts über den Moniker abfragen
                      monikerContainer[0].GetDisplayName(bindInfo, null, out displayName);
  
                      // Bindungsobjekt entsorgen
                      Marshal.ReleaseComObject(bindInfo);
                      /*
                      // Wenn der Anzeigename mit dem gesuchten übereinstimmt ...
                      if (displayName.IndexOf(objectDisplayName) != -1)
                      {
                          // Variable für COM-Objekt
                          object comInstance;
  
                          // COM-Objekt über den Anzeigenamen abrfragen
                          runningObjectTable.GetObject(monikerContainer[0], out comInstance);
  
                          // COM-Objekt zurückgeben
                          return comInstance;
                      }
                      */
                      // Variable für COM-Objekt
                      object comInstance;
                      Application qvApp;
                      // COM-Objekt über den Anzeigenamen abrfragen
                      runningObjectTable.GetObject(monikerContainer[0], out comInstance);
  
                      if (comInstance is Application)
                      {
                          qvApp = (Application)comInstance;
                          int pid = qvApp.GetProcessId();
                          if (pid == id)
                          {
                              return qvApp;
                          }
  
                      }
  
                  }
              }
              catch
              {
                  // Nichts zurückgeben
                  return null;
              }
              finally
              {
                  // Ggf. COM-Verweise entsorgen
                  if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable);
                  if (monikerList != null) Marshal.ReleaseComObject(monikerList);
              }
              // Nichts zurückgeben
              return null;
          } 
  </code></pre>
  
  <p>So, how can I get a certain object back with a special process id???</p>
  
  <h1>Edit (How looks my ROT)</h1>
  
  <p>I am interested in the yellow one's.
  <img src="https://i.stack.imgur.com/7bxjT.png" alt="enter image description here"></p>