运行对象表,通过特殊的进程ID获取对象

时间:2014-01-08 09:25:33

标签: c# com process

我遇到了麻烦。我想用C#启动进程(目标是在后台启动一个特殊文档的几个应用程序)。现在这是由我完成的,我将程序作为一个不可见的进程启动,但我想通过我的代码指导应用程序。所以,我希望有一个对象(具有特殊Process-ID的对象),它位于Running Object Table上。我无法解决这个问题,因为我总是得到第一个应用程序。

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;
        } 

那么,我怎么能用一个特殊的进程id ???

来获取某个对象

编辑(如何查看我的ROT)

我对黄色的感兴趣。 enter image description here

0 个答案:

没有答案