public static List<RunningObjectTableComponentInfo> GetComponentsFromROT() { IEnumMoniker monikerList = null; IRunningObjectTable runningObjectTable = null; List<RunningObjectTableComponentInfo> resultList = new List<RunningObjectTableComponentInfo>(); try { // query table and returns null if no objects runnings if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null; // query moniker & reset runningObjectTable.EnumRunning(out monikerList); monikerList.Reset(); IMoniker[] monikerContainer = new IMoniker[1]; IntPtr pointerFetchedMonikers = IntPtr.Zero; // fetch all moniker while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0) { // create binding object IBindCtx bindInfo; CreateBindCtx(0, out bindInfo); // query com proxy info object comInstance = null; runningObjectTable.GetObject(monikerContainer[0], out comInstance); string ppszDisplayName; try { monikerContainer[0].GetDisplayName(bindInfo, null, out ppszDisplayName); } catch { ppszDisplayName = ""; } Guid pClassID; try { monikerContainer[0].GetClassID(out pClassID); } catch { pClassID = Guid.Empty; } System.Runtime.InteropServices.ComTypes.FILETIME pLastChangedFileTime; try { runningObjectTable.GetTimeOfLastChange(monikerContainer[0], out pLastChangedFileTime);} catch { pLastChangedFileTime = new System.Runtime.InteropServices.ComTypes.FILETIME(); } long pcbSize; try { monikerContainer[0].GetSizeMax(out pcbSize);} catch { pcbSize = 0;} Boolean IsDirty; try {IsDirty = (monikerContainer[0].IsDirty() == 0); } catch {IsDirty = false;} Boolean IsRunning; try {IsRunning = (runningObjectTable.IsRunning(monikerContainer[0]) == 0); } catch {IsRunning = false;} // creating the unbound object to hold the Data out of the current component IMoniker RunningObjectTableComponentInfo ROTComponent = new RunningObjectTableComponentInfo( ppszDisplayName, pClassID, ConvertFromFILETIME(pLastChangedFileTime), pcbSize, TypeDescriptor.GetComponentName(comInstance, false), TypeDescriptor.GetClassName(comInstance), IsRunning, IsDirty ); resultList.Add(ROTComponent); // clean up and release object Marshal.ReleaseComObject(comInstance); Marshal.ReleaseComObject(bindInfo); } // not running return resultList; } finally { // release proxies if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable); if (monikerList != null) Marshal.ReleaseComObject(monikerList); } }
public static object GetInstanceFromROT(RunningObjectTableComponentInfo RunningComponent) { IEnumMoniker monikerList = null; IRunningObjectTable runningObjectTable = null; object ResultInstance = null; try { // query table and returns null if no objects runnings if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null; // query moniker & reset runningObjectTable.EnumRunning(out monikerList); monikerList.Reset(); IMoniker[] monikerContainer = new IMoniker[1]; IntPtr pointerFetchedMonikers = IntPtr.Zero; // fetch all moniker while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0) { // create binding object IBindCtx bindInfo; CreateBindCtx(0, out bindInfo); // query com proxy info object comInstance = null; runningObjectTable.GetObject(monikerContainer[0], out comInstance); string ppszDisplayName; try { monikerContainer[0].GetDisplayName(bindInfo, null, out ppszDisplayName); } catch { ppszDisplayName = ""; } Guid pClassID; try { monikerContainer[0].GetClassID(out pClassID); } catch { pClassID = Guid.Empty; } string ClassName; try { ClassName = TypeDescriptor.GetClassName(comInstance); } catch { ClassName = ""; } string ComponentName; try { ComponentName = TypeDescriptor.GetComponentName(comInstance, false); } catch { ComponentName = ""; } if ((RunningComponent.DisplayName == ppszDisplayName) && (RunningComponent.ClsID == pClassID) && (RunningComponent.ComponentClassName == ClassName) && (RunningComponent.ComponentName == ComponentName) ) { Marshal.ReleaseComObject(bindInfo); ResultInstance = comInstance; } else Marshal.ReleaseComObject(comInstance); Marshal.ReleaseComObject(bindInfo); } return ResultInstance; } finally { // release proxies if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable); if (monikerList != null) Marshal.ReleaseComObject(monikerList); } }