ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)
2015-01-01 23:35
218 查看
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.dll csc /l:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi |
键入以下命令:
csc interop2.cs interop2 %windir%\clock.avi |
1.B,示例代码(Sample Code)返回顶部 |
// 版权所有(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."); } }
View Code
1.B.2,
1.C,下载地址(Free Download)返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
相关文章推荐
- ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分)
- ylbtech-LanguageSamples-OfficeSample(COM 互操作)
- ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID
- 一个使用ASP.NET来操作COM的磁盘配额代码.
- 《COM 原理与应用》学习笔记 - 第一部分 COM原理
- VS 2005 C#操作 XMLhttp://www.cnblogs.com/cstded/archive/2007/02/16/651685.html
- com与net互操作
- ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID
- COM与.net的交互操作之在把.net注册成"COM"
- COM操作Excel
- Js+XML 操作 http://www.cnblogs.com/skylaugh/archive/2006/09/15/505393.html
- XiaoZhu.com: 制作符合W3C规范的网页(第一部分)
- COM中语言互操作小谈
- COM入门第一部分 - 什么是COM和如何使用COM
- COM与.NET的互操作
- C#与DLL和COM的混合编程(3)- 高级COM互操作(Advanced COM Interop)
- .net中调用com的具体操作(总结)
- 你如何使用javaBean操作数据库(摘自www.CnJsp.com)
- aspnet中操作excel报com错误的解决方法
- ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID(转)