Пример #1
0
        /// <summary>
        /// フィルタ一覧の取得
        /// </summary>
        /// <param name="category">デバイスのカテゴリ</param>
        /// <returns>
        ///		取得したフィルタ情報のコレクションを返します。
        /// </returns>
        public static List <CxFilterInfo> GetFilterList(Guid category)
        {
            var result = new List <CxFilterInfo>();

            System.Runtime.InteropServices.ComTypes.IEnumMoniker enumerator = null;
            ICreateDevEnum device = null;

            try
            {
                // ICreateDevEnum インターフェース取得.
                device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid(GUID.CLSID_SystemDeviceEnum)));

                // EnumMonikerの作成.
                device.CreateClassEnumerator(ref category, ref enumerator, 0);
                if (enumerator == null)
                {
                    return(result);
                }

                // 列挙.
                var monikers = new System.Runtime.InteropServices.ComTypes.IMoniker[1];
                var fetched  = IntPtr.Zero;

                while (enumerator.Next(monikers.Length, monikers, fetched) == 0)
                {
                    // プロパティバッグへのバインド.
                    IPropertyBag propbag = null;
                    {
                        object tmp  = null;
                        Guid   guid = new Guid(GUID.IID_IPropertyBag);
                        monikers[0].BindToStorage(null, null, ref guid, out tmp);
                        propbag = (IPropertyBag)tmp;
                    }

                    try
                    {
                        var info = new CxFilterInfo();

                        // 名前取得.
                        try
                        {
                            object friendly_name = null;
                            propbag.Read("FriendlyName", ref friendly_name, 0);
                            info.Name = (string)friendly_name;
                        }
                        catch (Exception)
                        {
                        }

                        // CLSID取得.
                        try
                        {
                            object clsid = null;
                            propbag.Read("CLSID", ref clsid, 0);
                            info.CLSID = (string)clsid;
                        }
                        catch (Exception)
                        {
                        }

                        // コレクションに追加.
                        result.Add(info);
                    }
                    finally
                    {
                        // プロパティバッグの解放.
                        Marshal.ReleaseComObject(propbag);

                        // 列挙したモニカの解放.
                        for (int mmm = 0; mmm < monikers.Length; mmm++)
                        {
                            if (monikers[mmm] != null)
                            {
                                Marshal.ReleaseComObject(monikers[mmm]);
                            }
                            monikers[mmm] = null;
                        }
                    }
                }

                // 同名フィルタの順番付け.
                for (int i = 0; i < result.Count - 1; i++)
                {
                    for (int j = i + 1; j < result.Count; j++)
                    {
                        if (result[j].Name == result[i].Name)
                        {
                            result[j].Index = result[i].Index + 1;
                            break;
                        }
                    }
                }
            }
            finally
            {
                if (enumerator != null)
                {
                    Marshal.ReleaseComObject(enumerator);
                }
                if (device != null)
                {
                    Marshal.ReleaseComObject(device);
                }
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// フィルタ生成
        /// </summary>
        /// <param name="category">フィルタのカテゴリ</param>
        /// <param name="clsid">フィルタの CLSID (省略する場合は null を指定してください。)</param>
        /// <param name="index">指標 [0~]</param>
        /// <returns>
        ///		生成されたフィルタを返します。
        /// </returns>
        /// <remarks>
        ///		seealso: https://msdn.microsoft.com/en-us/library/windows/desktop/dd407292(v=vs.85).aspx <br/>
        /// </remarks>
        public static IBaseFilter CreateFilter(Guid category, string clsid, int index)
        {
            System.Runtime.InteropServices.ComTypes.IEnumMoniker enumerator = null;
            ICreateDevEnum device = null;

            try
            {
                // ICreateDevEnum インターフェース取得.
                device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid(GUID.CLSID_SystemDeviceEnum)));

                // EnumMonikerの作成.
                device.CreateClassEnumerator(ref category, ref enumerator, 0);

                // 列挙.
                var    monikers = new System.Runtime.InteropServices.ComTypes.IMoniker[1];
                IntPtr fetched  = IntPtr.Zero;

                while (enumerator.Next(monikers.Length, monikers, fetched) == 0)
                {
                    System.Runtime.InteropServices.ComTypes.IMoniker moniker = monikers[0];

                    // プロパティバッグへのバインド.
                    IPropertyBag propbag = null;
                    {
                        object tmp  = null;
                        Guid   guid = new Guid(GUID.IID_IPropertyBag);
                        moniker.BindToStorage(null, null, ref guid, out tmp);
                        propbag = (IPropertyBag)tmp;
                    }

                    try
                    {
                        // フィルタ名の判定.
                        if (!string.IsNullOrEmpty(clsid))
                        {
                            object tmp = null;
                            propbag.Read("CLSID", ref tmp, 0);
                            if ((string)tmp != clsid)
                            {
                                continue;
                            }
                        }

                        // 指標の判定.
                        if (index > 0)
                        {
                            index--;
                            continue;
                        }

                        // フィルタインスタンス取得.
                        object filter = null;
                        {
                            Guid guid = new Guid(GUID.IID_IBaseFilter);
                            moniker.BindToObject(null, null, ref guid, out filter);
                        }
                        if (filter == null)
                        {
                            throw new System.NotSupportedException();
                        }
                        return((IBaseFilter)filter);
                    }
                    finally
                    {
                        // プロパティバッグの解放
                        Marshal.ReleaseComObject(propbag);

                        // 列挙したモニカの解放.
                        for (int mmm = 0; mmm < monikers.Length; mmm++)
                        {
                            if (monikers[mmm] != null)
                            {
                                Marshal.ReleaseComObject(monikers[mmm]);
                            }
                            monikers[mmm] = null;
                        }
                    }
                }
                throw new System.NotSupportedException();
            }
            finally
            {
                if (enumerator != null)
                {
                    Marshal.ReleaseComObject(enumerator);
                }
                if (device != null)
                {
                    Marshal.ReleaseComObject(device);
                }
            }
        }