ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)
1.A,示例(Sample) 返回顶部

“COM 互操作 - 第一部分”示例

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

安全说明

提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例。 对于因将此代码示例用于其他用途而发生的偶然或必然损害,Microsoft 不承担任何责任。

注意:如果启用 nopia 选项,您将无法新建 COM 组件类。

在 Visual Studio 中生成并运行“COM 互操作 - 第一部分”示例

  1. 在“解决方案资源管理器”中,右击“Interop1”项目并单击“设为启动项目”。

  2. 在“解决方案资源管理器”中,右击“Interop1”项目并单击“属性”。

  3. 打开“配置属性”文件夹并单击“调试”。

  4. 在“命令行参数”属性中,输入一个 AVI 文件,例如 c:\winnt\clock.avi

  5. 单击“确定”。

  6. 在“调试”菜单中,单击“开始执行(不调试)”。

  7. 对 Interop2 重复前面这些步骤。

如果 Interop1 附带的 QuartzTypeLib.dll 已过期

  1. 在“解决方案资源管理器”中,为 Interop1 打开“引用”。

  2. 右击“QuartzTypeLib”,然后单击“删除”。

  3. 右击“引用”,然后单击“添加引用”。

  4. 在“COM”选项卡中,选择名为“ActiveMovie 控件类型库”的组件。

  5. 单击“选择”,然后单击“确定”。

  6. 重新生成 Interop1。

    注意

    添加对该组件的引用等效于在命令行中调用 tlbimp 以创建 QuartzTypeLib.dll(如下所示)。

从命令行生成并运行“COM 互操作 - 第一部分”示例

  1. 使用“更改目录”命令转到“Interop1”目录。

  2. 键入以下命令:

    tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll
    csc /l:QuartzTypeLib.dll interop1.cs
    interop1 %windir%\clock.avi
  3. 使用“更改目录”命令转到“Interop2”目录。

  4. 键入以下命令:

    csc interop2.cs
    interop2 %windir%\clock.avi
 

注意:如果启用 nopia 选项,您将无法新建 COM 组件类。

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 != )
{
DisplayUsage();
return;
} if (args[] == "/?")
{
DisplayUsage();
return;
} string filename = args[]; // 检查文件是否存在
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 != )
{
DisplayUsage();
return;
} if (args[] == "/?")
{
DisplayUsage();
return;
} String filename = args[]; // 检查文件是否存在
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 互操作 - 第一部分)的更多相关文章

  1. C# 4.0 的 Visual Studio 2010 示例

    C# 4.0 的 Visual Studio 2010 示例 我们将 C# 示例分为两种不同的类别: 语言示例 LINQ 示例 语言示例 语言示例帮助您熟悉各种 C# 语言功能.这些示例包含在 Lan ...

  2. ActiveX(一)第一个简单的Demo

    说道ActiveX,我的第一直觉就是Flash,利用ActiveX.我们可以创建丰富的可交互式应用程序.同时.利用ActiveX特性.我们可以实现Js 与 ActiveX 的无缝连接(包括数据共享.和 ...

  3. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  4. 快学Scala第一部分

    转载: 1.变量声明 val answer = 8 * 5 + 2; //常量 var counter = 0;    //变量 //在必要的时候 ,可以指定类型 val greeting:Strin ...

  5. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)[转]

    IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)   目前最流行的跨平台交互是采用http协议通过JSON对象进行互操作.这种方式最简单,也很高效.webservi ...

  6. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  7. 2013Esri全球用户大会之互操作和标准

    1:Esri在开源领域做过哪些工作? Esri一直以来就是开源技术的用户和支持者.我们相信,通过提供从上到下的开放平台可使我们的用户成为开发能力强大的解决方案的积极参与者.在现有技术形势下,我们正在将 ...

  8. WebService第一天

    WebService第一天 [课程安排]: 整体安排:2天: 第一天:webservice入门,JDK规范和实现:jax-ws,相关概念 第二天:CXF框架,和spring的集成开发.Hessian的 ...

  9. LuaJavaBridge - Lua 与 Java 互操作的简单解决方案

    http://dualface.github.io/blog/2013/01/01/call-java-from-lua/ 最近在游戏里要集成中国移动的 SDK,而这些 SDK 都是用 Java 编写 ...

随机推荐

  1. HDU 1798 Tell me the area (数学)

    题目链接 Problem Description     There are two circles in the plane (shown in the below picture), there ...

  2. Linux eject弹出光驱

    Linux eject命令用于退出抽取式设备. 若设备已挂入,则eject会先将该设备卸除再退出. 语法 eject [-dfhnqrstv][-a <开关>][-c <光驱编号&g ...

  3. [Leetcode Week6]Reorder List

    Reorder List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/reorder-list/description/ Description G ...

  4. v4l打开video设备 ,执行VIDIOC_DQBUF,出现Resource temporarily unavailable 问题【转】

    转自:http://blog.csdn.net/china_video_expert/article/details/7236856 版权声明:本文为博主原创文章,未经博主允许不得转载. 如果你在执行 ...

  5. 出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int

    出现这种错误的原因,是因为函数没有写返回值.是在VC6.0的工程转为高版本(VS2010)的时候经常出现的; #include <stdio.h> main() { printf(&quo ...

  6. Spring+Junit,测试事务时,一直回滚

    研究了好长时间,都不知道原因,也不能解决. 控制台又没有报异常,但是就是一直回滚.注释掉spring声明式配置的代码,就能正确的更新数据. 从网上看了,别人的文章 http://blog.csdn.n ...

  7. 使用socket获取html

    import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "www.baidu.com& ...

  8. 在 C# 中通过 P/Invoke 调用Win32 DLL

    在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...

  9. 配置WCF

    出处:http://blog.csdn.net/fangxing80/article/details/6106228 前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种W ...

  10. KDJ回测

    # -*- coding: utf-8 -*- import os import pandas as pd # ========== 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表stock_ ...