• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C#如果与非托管com组建交互的代码示范

OC/C/C++ 水墨上仙 1152次浏览

本示例演示了 C# 程序如何能够与非托管 COM 组件交互操作

// interop1.cs
// 用“csc /R:QuartzTypeLib.dll interop1.cs”生成
using System;
class MainClass 
{ 
	/************************************************************ 
	摘要:此方法收集要显示的 AVI 的文件名,
	然后创建 Quartz COM 对象的实例。
	为了显示 AVI,程序对 IMediaControl 调用 RenderFile 和 Run。 
	Quartz 使用自己的线程和窗口显示 
	AVI。主线程阻塞在 ReadLine 上,直到用户按
	Enter 键为止。
		输入参数:要显示的 avi 文件的位置。
		返回值:void
	**************************************************************/ 
	public static void Main(string[] args) 
	{ 
		// 检查用户是否传入了文件名 
		if (args.Length != 1)
		{ 
			DisplayUsage();
			return;
		} 
		if (args[0] == "/?")
		{ 
			DisplayUsage();
			return;
		} 
		string filename = args[0]; 
		// 检查文件是否存在
		if (!System.IO.File.Exists(filename))
		{
			Console.WriteLine("File " + filename + " not found.");
			DisplayUsage();
			return;
		}
    
		// 创建 Quartz 的实例
		// (Calls CoCreateInstance(E436EBB3-524F-11CE-9F53-0020AF0BA770,
		// NULL, CLSCTX_ALL, IID_IUnknown, &graphManager).): 
		try
		{
			QuartzTypeLib.FilgraphManager graphManager = 
				new QuartzTypeLib.FilgraphManager();
			// IMediaControl 接口的 QueryInterface:
			QuartzTypeLib.IMediaControl mc =
				(QuartzTypeLib.IMediaControl)graphManager;
			// 对 COM 接口调用某些方法 
			// 将文件传递给 COM 对象的 RenderFile 方法。 
			mc.RenderFile(filename);
			// 显示文件。 
			mc.Run();
		}
		catch(Exception ex)
		{
			Console.WriteLine("Unexpected COM exception: " + ex.Message);
		}
		// 等待完成。
		Console.WriteLine("Press Enter to continue."); 
		Console.ReadLine();
	}
    
	private static void DisplayUsage() 
	{ 
		// 用户未提供足够的参数。 
		// 显示用法:
		Console.WriteLine("VideoPlayer: Plays AVI files."); 
		Console.WriteLine("Usage: VIDEOPLAYER.EXE filename"); 
		Console.WriteLine("where filename is the full path and"); 
		Console.WriteLine("file name of the AVI to display."); 
	} 
}

&nbspinterop2.cs

// interop2.cs
// 编译时使用 “csc interop2.cs”  
using System;
using System.Runtime.InteropServices;
namespace QuartzTypeLib 
{
	// 将 IMediaControl 声明为一个从 IDispatch 接口派生的 
	// COM 接口:
	[Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"), 
	InterfaceType(ComInterfaceType.InterfaceIsDual)] 
	interface IMediaControl   // 此处不能列出任何基接口
	{ 
		// 注意 IUnknown 接口成员未在此处列出:
		void Run();
		void Pause();
		void Stop();
		void GetState( [In] int msTimeout, [Out] out int pfs);
		void RenderFile(
			[In, MarshalAs(UnmanagedType.BStr)] string strFilename);
		void AddSourceFilter( 
			[In, MarshalAs(UnmanagedType.BStr)] string strFilename, 
			[Out, MarshalAs(UnmanagedType.Interface)]
			out object ppUnk);
		[return: MarshalAs(UnmanagedType.Interface)] 
		object FilterCollection();
		[return: MarshalAs(UnmanagedType.Interface)] 
		object RegFilterCollection();
            
		void StopWhenReady(); 
	}
	// 将 FilgraphManager 声明为 COM coclass:
	[ComImport, Guid("E436EBB3-524F-11CE-9F53-0020AF0BA770")] 
	class FilgraphManager   // 此处不能有基类或
		// 接口列表。
	{ 
		// 此处不能有任何成员
		// 注意,C# 编译器将为您添加默认构造函数
		//(不带参数)。
	}
}
class MainClass 
{ 
	/********************************************************** 
	摘要:此方法收集要显示的 AVI 的文件名,
	然后创建 Quartz COM 对象的实例。 
	为了显示 AVI,程序对
	IMediaControl 调用 RenderFile 和 Run。Quartz 使用自己的线程和窗口来显示 
	AVI。主线程阻塞在 ReadLine 上,直到用户按
	Enter 键为止。
		输入参数:要显示的 avi 文件的位置
		返回值:void
	*************************************************************/ 
	public static void Main(string[] args) 
	{ 
		// 检查用户是否传入了文件名:
		if (args.Length != 1) 
		{ 
			DisplayUsage();
			return;
		} 
		if (args[0] == "/?") 
		{ 
			DisplayUsage(); 
			return;
		}
		String filename = args[0]; 
		// 检查文件是否存在
		if (!System.IO.File.Exists(filename))
		{
			Console.WriteLine("File " + filename + " not found.");
			DisplayUsage();
			return;
		}
		// 创建 Quartz 的实例
		// (Calls CoCreateInstance(E436EBB3-524F-11CE-9F53-0020AF0BA770, 
		//  NULL, CLSCTX_ALL, IID_IUnknown, 
		//  &graphManager).):
		try
		{
			QuartzTypeLib.FilgraphManager graphManager =
				new QuartzTypeLib.FilgraphManager();
			// IMediaControl 接口的 QueryInterface:
			QuartzTypeLib.IMediaControl mc = 
				(QuartzTypeLib.IMediaControl)graphManager;
			// 对 COM 接口调用某些方法。
			// 将文件传递给 COM 对象上的 RenderFile 方法。
			mc.RenderFile(filename);
        
			// 显示文件。 
			mc.Run();
		}
		catch(Exception ex)
		{
			Console.WriteLine("Unexpected COM exception: " + ex.Message);
		}
		// 等待完成。 
		Console.WriteLine("Press Enter to continue."); 
		Console.ReadLine();
	}
	private static void DisplayUsage() 
	{ 
		// 用户未提供足够的参数。 
		// 显示用法。
		Console.WriteLine("VideoPlayer: Plays AVI files."); 
		Console.WriteLine("Usage: VIDEOPLAYER.EXE filename"); 
		Console.WriteLine("where filename is the full path and");
		Console.WriteLine("file name of the AVI to display."); 
	} 
}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C#如果与非托管com组建交互的代码示范
喜欢 (0)
加载中……