// Gets the objects to iterate over to make the child nodes
		protected override ICollection GetChildren()
		{
			lock (_allChildren) {
				if (_allChildren.Count > 0) {
					_progress = null;
					return _allChildren.Values;
				}

				_progress = new ProgressDialog();

				String[] keys = _baseKey.GetSubKeyNames();
			
				// Show the progress of both reading the interfaces and
				// building the tree
				_progress.Setup(String.Format(StringParser.Parse("${res:ComponentInspector.ProgressDialog.GettingInformationDialogTitle}"), _progressName),
							   String.Format(StringParser.Parse("${res:ComponentInspector.ProgressDialog.GettingInformationMessage}"), _progressName),
							   keys.Length * 2,
							   !ProgressDialog.HAS_PROGRESS_TEXT,
							   ProgressDialog.FINAL);
				_progress.ShowIfNotDone();

				foreach (String str in keys) {
					try {
						// Update early in case there is an exception 
						// with this one
						_progress.UpdateProgress(1);

						RegistryKey key = _baseKey.OpenSubKey(str);

						Object info = ProcessChild(key, str);
						if (info != null) {
							_allChildren.Add(GetSortKey(info), info);
						} else {
							// Account for the fact that this will not be
							// present in the AllocateChildNode
							_progress.UpdateProgress(1);
						}
					} catch (Exception ex) {
						// Account for the fact that this will not be
						// present in the AllocateChildNode
						_progress.UpdateProgress(1);

						TraceUtil.WriteLineIf
							(null, TraceLevel.Info,
							 "Failure to read: " 
							 + str + " " + ex);
					}
				}	

			}
			return _allChildren.Values;
		}
Beispiel #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();
		}
		// 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;
		}
		internal static ICollection GetRegisteredTypeLibs(ProgressDialog progress)
		{
			lock (typeof(TypeLibrary)) {
				if (_registeredTypeLibsValid) {
					if (progress != null) {
						progress.UpdateProgress(_registeredTypeLibs.Values.Count);
					}
					return _registeredTypeLibs.Values;
				}
				String[] keys = Windows.KeyTypeLib.GetSubKeyNames();
				foreach (String str in keys) {
					if (progress != null)
						progress.UpdateProgress(1);
					GetTypeLibsFromRegistry(str);
				}    
				_registeredTypeLibsValid = true;
			}
			return _registeredTypeLibs.Values;
		}
		// 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();
		}