ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)

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(如下所示)。

  7.  

从命令行生成并运行“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
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."); 
    } 
}
View Code

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."); 
    } 
}
View Code

1.B.2,

1.C,下载地址(Free Download)返回顶部

 

warn 作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted on 2015-01-01 23:35  ylbtech  阅读(230)  评论(0编辑  收藏  举报