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));
        }