首页 > 代码库 > ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)
ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分) |
1.A,示例(Sample) 返回顶部 |
“COM 互操作 - 第一部分”示例
本示例演示了 C# 程序如何能够与非托管 COM 组件进行互操作。
安全说明 |
---|
提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例。 对于因将此代码示例用于其他用途而发生的偶然或必然损害,Microsoft 不承担任何责任。 注意:如果启用 nopia 选项,您将无法新建 COM 组件类。 |
在 Visual Studio 中生成并运行“COM 互操作 - 第一部分”示例
在“解决方案资源管理器”中,右击“Interop1”项目并单击“设为启动项目”。
在“解决方案资源管理器”中,右击“Interop1”项目并单击“属性”。
打开“配置属性”文件夹并单击“调试”。
在“命令行参数”属性中,输入一个 AVI 文件,例如
c:\winnt\clock.avi
。单击“确定”。
在“调试”菜单中,单击“开始执行(不调试)”。
对 Interop2 重复前面这些步骤。
如果 Interop1 附带的 QuartzTypeLib.dll 已过期
在“解决方案资源管理器”中,为 Interop1 打开“引用”。
右击“QuartzTypeLib”,然后单击“删除”。
右击“引用”,然后单击“添加引用”。
在“COM”选项卡中,选择名为“ActiveMovie 控件类型库”的组件。
单击“选择”,然后单击“确定”。
重新生成 Interop1。
注意 添加对该组件的引用等效于在命令行中调用 tlbimp 以创建 QuartzTypeLib.dll(如下所示)。
从命令行生成并运行“COM 互操作 - 第一部分”示例
使用“更改目录”命令转到“Interop1”目录。
键入以下命令:
tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dllcsc /l:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi
使用“更改目录”命令转到“Interop2”目录。
键入以下命令:
csc interop2.csinterop2 %windir%\clock.avi
1.B,示例代码(Sample Code)返回顶部 |
1.B.1, interop1.cs
// 版权所有(C) Microsoft Corporation。保留所有权利。// 此代码的发布遵从// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。////版权所有(C) Microsoft Corporation。保留所有权利。// 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."); } }
1.B.2,
1.B,示例代码2(Sample Code)返回顶部 |
1.B.1, interop2.cs
// 版权所有(C) Microsoft Corporation。保留所有权利。// 此代码的发布遵从// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。////版权所有(C) Microsoft Corporation。保留所有权利。// 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 组件类: [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."); } }
1.B.2,
1.C,下载地址(Free Download)返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。