Example #1
0
		// 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;
		}
Example #2
0
		// 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();
		}