⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsdevice.cs

📁 一个非常完整的网络会议系统
💻 CS
字号:
/******************************************************
                  DirectShow .NET
		      netmaster@swissonline.ch
*******************************************************/
//					DsDevice
// enumerate directshow devices and moniker handling


using System;
using System.Collections;
using System.Runtime.InteropServices;

namespace DShowNET.Device
{

		[ComVisible(false)]
	public class DsDev
	{

		public static bool GetDevicesOfCat( Guid cat, out ArrayList devs )
		{
			devs = null;
			int hr;
			object comObj = null;
			ICreateDevEnum enumDev = null;
			UCOMIEnumMoniker enumMon = null;
			UCOMIMoniker[] mon = new UCOMIMoniker[1];
			try {
				Type	srvType = Type.GetTypeFromCLSID( Clsid.SystemDeviceEnum );
				if( srvType == null )
					throw new NotImplementedException( "System Device Enumerator" );

				comObj = Activator.CreateInstance( srvType );
				enumDev = (ICreateDevEnum) comObj;
				hr = enumDev.CreateClassEnumerator( ref cat, out enumMon, 0 );
				if( hr != 0 )
					throw new NotSupportedException( "No devices of the category" );

				int f, count = 0;
				do
				{
					hr = enumMon.Next( 1, mon, out f );
					if( (hr != 0) || (mon[0] == null) )
						break;
					DsDevice dev = new DsDevice();
					dev.Name = GetFriendlyName( mon[0] );
					if( devs == null )
						devs = new ArrayList();
					dev.Mon = mon[0]; mon[0] = null;
					devs.Add( dev ); dev = null;
					count++;
				}
				while(true);

				return count > 0;
			}
			catch( Exception )
			{
				if( devs != null )
				{
					foreach( DsDevice d in devs )
						d.Dispose();
					devs = null;
				}
				return false;
			}
			finally
			{
				enumDev = null;
				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;
			}

		}

		private static string GetFriendlyName( UCOMIMoniker mon )
		{
			object bagObj = null;
			IPropertyBag bag = null;
			try {
				Guid bagId = typeof( IPropertyBag ).GUID;
				mon.BindToStorage( null, null, ref bagId, out bagObj );
				bag = (IPropertyBag) bagObj;
				object val = "";
				int hr = bag.Read( "FriendlyName", ref val, IntPtr.Zero );
				if( hr != 0 )
					Marshal.ThrowExceptionForHR( hr );
				string ret = val as string;
				if( (ret == null) || (ret.Length < 1) )
					throw new NotImplementedException( "Device FriendlyName" );
				return ret;
			}
			catch( Exception )
			{
				return null;
			}
			finally
			{
				bag = null;
				if( bagObj != null )
					Marshal.ReleaseComObject( bagObj ); bagObj = null;
			}
		}
	}


		[ComVisible(false)]
	public class DsDevice : IDisposable
	{
		public string			Name;
		public UCOMIMoniker		Mon;
		
		public void Dispose()
		{
			if( Mon != null )
				Marshal.ReleaseComObject( Mon ); Mon = null;
		}
	}







	[ComVisible(true), ComImport,
	Guid("29840822-5B84-11D0-BD3B-00A0C911CE86"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface ICreateDevEnum
{
		[PreserveSig]
	int CreateClassEnumerator(
		[In]											ref Guid			pType,
		[Out]										out UCOMIEnumMoniker	ppEnumMoniker,
		[In]											int					dwFlags );
}



	[ComVisible(true), ComImport,
	Guid("55272A00-42CB-11CE-8135-00AA004BB851"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IPropertyBag
{
		[PreserveSig]
	int Read(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			pszPropName,
		[In, Out, MarshalAs(UnmanagedType.Struct)]	ref	object			pVar,
		IntPtr pErrorLog );

		[PreserveSig]
	int Write(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			pszPropName,
		[In, MarshalAs(UnmanagedType.Struct)]		ref	object			pVar );
}






} // namespace DShowNET.Device

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -