using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; namespace Yaulw.Win32 { /// /// COM Win32 Helper Functions /// public static class COM { /// /// Returns a pointer to an implementation of IBindCtx (a bind context object). This object stores information about a particular moniker-binding operation /// /// This parameter is reserved and must be 0 /// Address of an IBindCtx* pointer variable that receives the interface pointer to the new bind context object. /// This function can return the standard return values E_OUTOFMEMORY and S_OK [DllImport("ole32.dll")] public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); /// /// Returns a pointer to the IRunningObjectTable /// interface on the local running object table (ROT). /// /// This parameter is reserved and must be 0. /// The address of an IRunningObjectTable* pointer variable /// that receives the interface pointer to the local ROT. When the function is /// successful, the caller is responsible for calling Release on the interface /// pointer. If an error occurs, *pprot is undefined. /// This function can return the standard return values E_UNEXPECTED and S_OK. [DllImport("ole32.dll")] public static extern int GetRunningObjectTable(uint reserved, out System.Runtime.InteropServices.ComTypes.IRunningObjectTable pprot); /// /// Use this to retrieve the Actice COM Object from the ROT, for the specified progId /// /// /// a valid com object, or null if error occured public static Object GetActiceCOMObject(string progId) { Object app = null; try { app = Marshal.GetActiveObject(progId); } catch (SystemException) { /* ignore */ } return app; } /// /// ROT Object Entry /// public struct RunningObject { public string name; public object o; } /// /// Gets all Running Objects in the ROT (deos the same thing as GetRunningObjects()) /// ~got code snippet from a different website. keeping it in Just in case /// /// /// public static List GetActiveObjects(string MonikerFilter) { var ret = new List(); IRunningObjectTable pprot; IEnumMoniker ppenumMoniker; IMoniker[] monikers = new IMoniker[1]; GetRunningObjectTable(0, out pprot); pprot.EnumRunning(out ppenumMoniker); ppenumMoniker.Reset(); while (ppenumMoniker.Next(1, monikers, IntPtr.Zero) == 0) { IBindCtx ctx; CreateBindCtx(0, out ctx); string name; monikers[0].GetDisplayName(ctx, null, out name); if (String.IsNullOrEmpty(MonikerFilter) || (name.IndexOf(MonikerFilter) != -1)) { object val; pprot.GetObject(monikers[0], out val); ret.Add(new RunningObject() { name = name, o = val }); } } return ret; } /// /// Use this to Get All Running Objects in the ROT /// /// list of all Runnint Objects in the ROT public static List GetRunningObjects() { // Get the table. var res = new List(); IBindCtx bc; CreateBindCtx(0, out bc); IRunningObjectTable runningObjectTable; bc.GetRunningObjectTable(out runningObjectTable); IEnumMoniker monikerEnumerator; runningObjectTable.EnumRunning(out monikerEnumerator); monikerEnumerator.Reset(); // Enumerate and fill our nice dictionary. IMoniker[] monikers = new IMoniker[1]; IntPtr numFetched = IntPtr.Zero; while (monikerEnumerator.Next(1, monikers, numFetched) == 0) { RunningObject running; monikers[0].GetDisplayName(bc, null, out running.name); Type ff1 = monikers[0].GetType(); runningObjectTable.GetObject(monikers[0], out running.o); res.Add(running); } return res; } /// /// Use this to Get A specific type of Object from the ROT /// /// List of a specific type of Object in the ROT public static List GetRunningObjectsOfType() { // Get the table. var res = new List(); IBindCtx bc; CreateBindCtx(0, out bc); IRunningObjectTable runningObjectTable; bc.GetRunningObjectTable(out runningObjectTable); IEnumMoniker monikerEnumerator; runningObjectTable.EnumRunning(out monikerEnumerator); monikerEnumerator.Reset(); // Enumerate and fill our nice dictionary. IMoniker[] monikers = new IMoniker[1]; IntPtr numFetched = IntPtr.Zero; while (monikerEnumerator.Next(1, monikers, numFetched) == 0) { object o; runningObjectTable.GetObject(monikers[0], out o); if (o is T) res.Add((T)o); o = null; } return res; } } }