public List <T> GetAllComInstancesFromROT <T>(COMObjectsHelper comHelper) { var objects = new List <T>(); CreateBindCtx(0, out var bindCtx); if (bindCtx == null) { return(objects); } comHelper.Register(() => bindCtx); bindCtx.GetRunningObjectTable(out var rot); if (rot == null) { return(objects); } comHelper.Register(() => rot); rot.EnumRunning(out var enumMoniker); comHelper.Register(() => enumMoniker); enumMoniker.Reset(); var fetched = IntPtr.Zero; var moniker = comHelper.Register(() => new IMoniker[1]); while (enumMoniker.Next(1, moniker, fetched) == 0) { moniker[0].GetDisplayName(bindCtx, null, out var displayName); var hresult = rot.GetObject(moniker[0], out var obj); // Note: In case when retrieval operation was not succeed just skip further actions. if (hresult != 0) { Console.WriteLine($"Retrieve COM object failed with result: {hresult}"); continue; } comHelper.Register(() => obj); try { if (obj is T) { objects.Add((T)obj); } } catch (Exception ex) { Console.WriteLine($"Could not get instance of COM object because of: {ex.Message}"); Console.WriteLine(ex); } } return(objects); }
public static List <T> GetActiveInteropApp <T>(COMObjectsHelper comHelper, string interopAppName) { return(Wait.ForResult(() => { try { var comObject = Marshal.GetActiveObject(interopAppName); if (comObject == null) { return null; } comHelper.Register(() => comObject); return new List <T> { (T)comObject }; } catch (ElementNotAvailableException ex) { Console.WriteLine($"Exception thrown during getting '{interopAppName}' active interop object."); Console.WriteLine(ex); return null; } catch (COMException ex) { Console.WriteLine($"Exception thrown during getting '{interopAppName}' active interop object."); Console.WriteLine(ex); var comInstancesFromROT = comHelper.GetAllComInstancesFromROT <T>(comHelper); if (comInstancesFromROT.Count == 0) { return null; } return comInstancesFromROT; } }, timeoutMilliSeconds: 60000, retryRateDelayMilliSeconds: 5000)); }