/// <summary> /// This method gets a UCOMIMoniker object. /// /// HACK: The only way to create a UCOMIMoniker from a moniker /// string is to use UCOMIMoniker.ParseDisplayName(). So I /// need ANY UCOMIMoniker object so that I can call /// ParseDisplayName(). Does anyone have a better solution? /// /// This assumes there is at least one video compressor filter /// installed on the system. /// </summary> protected System.Runtime.InteropServices.ComTypes.IMoniker getAnyMoniker() { Guid category = FilterCategory.VideoCompressorCategory; object comObj = null; System.Runtime.InteropServices.ComTypes.IEnumMoniker enumMon = null; try { // Get the system device enumerator //Type srvType = Type.GetTypeFromCLSID(Clsid.SystemDeviceEnum); //if (srvType == null) // throw new NotImplementedException("System Device Enumerator"); //comObj = Activator.CreateInstance(srvType); ICreateDevEnum enumDev = (ICreateDevEnum) new CreateDevEnum(); // Create an enumerator to find filters in category int hr = enumDev.CreateClassEnumerator(category, out enumMon, 0); //int hr = enumDev.CreateClassEnumerator(ref category, out enumMon, 0); if (hr != 0) { throw new NotSupportedException("No devices of the category"); } // Get first filter IntPtr f = IntPtr.Zero; var mon = new System.Runtime.InteropServices.ComTypes.IMoniker[1]; hr = enumMon.Next(1, mon, f); if ((hr != 0)) { mon[0] = null; } return(mon[0]); } finally { if (enumMon != null) { Marshal.ReleaseComObject(enumMon); } enumMon = null; if (comObj != null) { Marshal.ReleaseComObject(comObj); } comObj = null; } }
public void Enum([In] int fForward, [MarshalAs(UnmanagedType.Interface)] out System.Runtime.InteropServices.ComTypes.IEnumMoniker ppenumMoniker) { throw new NotImplementedException(); }
/// <summary> Populate the InnerList with a list of filters from a particular category </summary> protected static IEnumerable <Filter> getFilters(Guid category) { object comObj = null; System.Runtime.InteropServices.ComTypes.IEnumMoniker enumMon = null; var mon = new System.Runtime.InteropServices.ComTypes.IMoniker[1]; try { // Get the system device enumerator //Type srvType = Type.GetTypeFromCLSID(Clsid.SystemDeviceEnum); //if (srvType == null) // throw new NotImplementedException("System Device Enumerator"); //comObj = Activator.CreateInstance(srvType); ICreateDevEnum enumDev = (ICreateDevEnum) new CreateDevEnum(); // Create an enumerator to find filters in category int hr = enumDev.CreateClassEnumerator(category, out enumMon, 0); if (hr != 0) { throw new NotSupportedException("No devices of the category"); } // Loop through the enumerator IntPtr f = IntPtr.Zero; do { // Next filter hr = enumMon.Next(1, mon, f); if ((hr != 0) || (mon[0] == null)) { break; } // Add the filter Filter filter = new Filter(mon[0]); //InnerList.Add(filter); yield return(filter); // Release resources Marshal.ReleaseComObject(mon[0]); mon[0] = null; }while (true); // Sort //InnerList.Sort(); } finally { if (mon[0] != null) { Marshal.ReleaseComObject(mon[0]); } mon[0] = null; if (enumMon != null) { Marshal.ReleaseComObject(enumMon); } enumMon = null; if (comObj != null) { Marshal.ReleaseComObject(comObj); } comObj = null; } }