// Finds the COM running objects public static IList GetRunningObjects(ProgressDialog progress) { ArrayList runningObjects = new ArrayList(); Hashtable runningHash = new Hashtable(); UCOMIBindCtx bc; UCOMIRunningObjectTable rot; UCOMIEnumMoniker em; UCOMIMoniker[] monikers = new UCOMIMoniker[1]; ActiveX.CreateBindCtx(0, out bc); bc.GetRunningObjectTable(out rot); rot.EnumRunning(out em); // Look at each Moniker in the ROT int unused; while (0 == em.Next(1, monikers, out unused)) { try { UCOMIMoniker moniker = monikers[0]; Object obj; rot.GetObject(moniker, out obj); String monikerName; moniker.GetDisplayName(bc, null, out monikerName); ComObjectInfo comObjInfo; // Check for duplicates against the other running objects Object runObj = runningHash[obj]; if (runObj != null) { // Get the existing object's moniker comObjInfo = (ComObjectInfo) ObjectInfo.GetObjectInfo(obj); if (monikerName.Equals(comObjInfo._monikerName)) { TraceUtil.WriteLineInfo (typeof(ComObjectInfo), "ROT - Skipping duplicate: " + monikerName); progress.UpdateProgress(1); continue; } } else { runningHash.Add(obj, obj); } comObjInfo = (ComObjectInfo) ObjectInfoFactory.GetObjectInfo(true, obj); // Need moniker name before update progress comObjInfo.CalcRunningObjName(rot, bc, moniker, monikerName); progress.UpdateProgressText(comObjInfo.GetMonikerName()); progress.UpdateProgress(1); runningObjects.Add(comObjInfo); TraceUtil.WriteLineIf(typeof(ComObjectInfo), TraceLevel.Info, "ROT - added: " + comObjInfo.GetName() + " " + comObjInfo.ObjType + " " + Win32Utils.RegKeyToString (comObjInfo._classIdKey) + Win32Utils.RegKeyToString (comObjInfo._classNameKey)); } catch (Exception ex) { TraceUtil.WriteLineIf(typeof(ComObjectInfo), TraceLevel.Info, "ROT - Exception processing ROT entry: " + ex); progress.UpdateProgress(1); continue; } } Marshal.ReleaseComObject(em); Marshal.ReleaseComObject(bc); Marshal.ReleaseComObject(rot); return runningObjects; }
// Restore the typelibs/controls that were previously loaded public static void RestoreComEnvironment() { if (_typelibs.Count == 0) return; ProgressDialog progressDialog = new ProgressDialog(); progressDialog.Setup("Loading Remembered ActiveX Files", "Please wait while I load the previously " + "opened ActiveX files.", _typelibs.Count, ProgressDialog.HAS_PROGRESS_TEXT, ProgressDialog.FINAL); progressDialog.ShowIfNotDone(); TraceUtil.WriteLineInfo(null, DateTime.Now + " ActiveX Restore start "); try { for (int i = _typelibs.Count - 1; i >= 0; --i) { PreviouslyOpenedTypeLibrary typeLib = _typelibs[i]; try { TraceUtil.WriteLineInfo(null, DateTime.Now + " restore assy: " + typeLib.FileName); progressDialog.UpdateProgressText(typeLib.FileName); Guid guid = new Guid(typeLib.Guid); TypeLibrary.RestoreTypeLib(typeLib.FileName, guid, typeLib.Version); TraceUtil.WriteLineInfo(null, DateTime.Now + " loaded assy: " + typeLib.FileName); progressDialog.UpdateProgress(1); } catch (Exception ex) { TraceUtil.WriteLineWarning(null, "Assemblies - deleting bad assemblies entry: " + typeLib.FileName + " " + ex); _typelibs.Remove(typeLib); progressDialog.UpdateProgress(1); } } // This depends on having all of the assemblies restored TraceUtil.WriteLineInfo(null, DateTime.Now + " ActiveX Restore end "); } catch (Exception ex) { TraceUtil.WriteLineError(null, "Unexpected exception " + "restoring assemblies: " + ex); } progressDialog.Finished(); if (ComponentInspectorProperties.AddRunningComObjects) { AddRunningObjs(); } FavoriteTypeLibNode.Expand(); }
// Restore the assemblies that were previously loaded public static void RestoreAssemblies() { AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(AssemblyLoadHandler); if (_assemblies.Count == 0) return; ProgressDialog progressDialog = new ProgressDialog(); progressDialog.Setup(StringParser.Parse("${res:ComponentInspector.ProgressDialog.LoadingPreviouslyOpenedAssembliesDialogTitle}"), StringParser.Parse("${res:ComponentInspector.ProgressDialog.LoadingPreviouslyOpenedAssembliesMessage}"), _assemblies.Count, ProgressDialog.HAS_PROGRESS_TEXT, ProgressDialog.FINAL); progressDialog.ShowIfNotDone(); TraceUtil.WriteLineInfo(null, DateTime.Now + " Assembly Restore start "); try { for (int i = _assemblies.Count - 1; i >= 0; --i) { PreviouslyOpenedAssembly assembly = _assemblies[i]; try { AssemblyName aName = new AssemblyName(); aName.CodeBase = assembly.CodeBase; TraceUtil.WriteLineInfo(null, DateTime.Now + " restore assy: " + assembly.CodeBase); progressDialog.UpdateProgressText(assembly.CodeBase); // Tell the TypeLibrary code the assembly // belongs to some type library Guid guid = Guid.Empty; // Don't mess with assemblies that came from // typelibs if the typelib is not there if (assembly.TypeLibGuid.Length > 0) { guid = new Guid(assembly.TypeLibGuid); TypeLibrary lib = TypeLibrary.GetTypeLibOpened(guid, assembly.TypeLibVersion); String assyFileName = new Uri(assembly.CodeBase).LocalPath; if (lib == null || !TypeLibrary.IsAssyCurrent(assyFileName, lib.FileName)) { TraceUtil.WriteLineInfo (null, DateTime.Now + " skipped assy (typelib not opened " + "or current): " + assembly.CodeBase); // Forget it _assemblies.Remove(assembly); progressDialog.UpdateProgress(1); continue; } } // The load event that happens under here causes the // assembly to appear in the tree Assembly assy = Assembly.Load(aName); // Tell the TypeLibrary code the assembly // belongs to some type library if (assembly.TypeLibGuid.Length > 0) TypeLibrary.RestoreAssembly(assy, guid, assembly.TypeLibVersion); TraceUtil.WriteLineInfo(null, DateTime.Now + " loaded assy: " + assembly.CodeBase); progressDialog.UpdateProgress(1); } catch (Exception ex) { TraceUtil.WriteLineWarning(null, "Assemblies - deleting bad assemblies entry: " + assembly.CodeBase + " " + ex); _assemblies.Remove(assembly); progressDialog.UpdateProgress(1); } } // This depends on having all of the assemblies restored TraceUtil.WriteLineInfo(null, DateTime.Now + " Assembly Restore end "); _assyRootNode.Expand(); } catch (Exception ex) { TraceUtil.WriteLineError(null, "Unexpected exception restoring assemblies: " + ex); } progressDialog.Finished(); }