知识大全 使用C#构建带事件的签名ActiveX组件

Posted 事件

篇首语:少年击剑更吹箫,剑气箫心一例消。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用C#构建带事件的签名ActiveX组件相关的知识,希望对你有一定的参考价值。

使用C#构建带事件的签名ActiveX组件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  使用C#构建带事件的签名ActiveX组件具体办法:

  第一步 创建ActiveX项目    使用 NET语言编写的ActiveX控件的主体就是一个类库 首先我们来创建这个类库项目 打开Visual Studio File >New >Project 选择Class Library 创建一个类库项目     创建ActiveX项目    第二步 编写ActiveX主体    ActiveX的主体包括方法定义接口 事件定义接口(可选) 实现这些接口的ActiveX主体类三个部分 下面是笔者原创的Demo     首先 我们创建方法定义接口:    ///<summary>    /// 该接口定义了ActiveX的方法    ///</summary>    [    Guid( F BD F E BFBD F DD DF )     InterfaceType(ComInterfaceType InterfaceIsDual)     ComVisible(true)]    publicinterfaceIBosnMaActiveX        [DispId( )]    void Start();    [DispId( )]    void Stop();        该接口内的成员会暴露给外部调用 这里我们提供两个简单方法Start和Stop 使用工具(Visual Studio > Tools > Create GUID)生成自己的GUID     接下来定义事件接口:    ///<summary>    /// 该接口定义了ActiveX的事件    ///</summary>    [ComVisible(true)]    [Guid( C F F F B e D B A C )]    [InterfaceType(ComInterfaceType InterfaceIsIDispatch)]    publicinterfaceBosnMaActiveXEvents        [DispId( )]    void OnRecorderStarted();    [DispId( )]    void OnRecorderStopped();    [DispId( )]    void OnRecorderVolumeChanged(int value);        这里我们为ActiveX定义三个事件 分别为OnRecorderStarted OnRecorderStopped OnRecorderVolumeChanged(带一个int参数)

    最后我们编写集成方法接口和事件接口的ActiveX主体类:    [    Guid( E CE EC b B C FFC A )     ProgId( ActiveXOfBosnMa BosnMaActiveX )     ClassInterface(ClassInterfaceType None)     ComDefaultInterface(typeof(IBosnMaActiveX))     ComSourceInterfaces(typeof(BosnMaActiveXEvents))     ComVisible(true)    ]    publicclassBosnAcX : IBosnMaActiveX IObjectSafety        #region Events Handlers Instances    publicdelegatevoidVolumeChangedHandler(int value);    publicdelegatevoidSimpleHandler();    publiceventVolumeChangedHandler OnRecorderVolumeChanged;    publiceventSimpleHandler OnRecorderStarted;    publiceventSimpleHandler OnRecorderStopped;    #endregion    #region Implementation of IBosnMaActiveX    ///<summary>    /// 调用该方法将引发OnRecorderStarted事件 并在 秒后引发OnRecorderVolumeChanged    ///</summary>    publicvoid Start()        OnRecorderStarted();    SimpleHandler d = Work;    d BeginInvoke(null null);        publicvoid Work()        Thread Sleep( );    OnRecorderVolumeChanged( );        ///<summary>    /// 调用该方法将引发OnRecorderStopped事件    ///</summary>    publicvoid Stop()        OnRecorderStopped();        #endregion        这里要注意主体类的事件名称要与事件接口(在上例中为BosnMaActiveXEvents)中的方法名相同 在BosnAcX中我们实现了IBosnMaActiveX中的方法 当调用Start()时引发一个OnRecorderStarted事件 并在 秒后引发一个OnRecorderVolumeChanged事件 在调用Stop()时引发一个OnRecorderStopped事件     编译并注册ActiveX    编译整个项目将输出dll     图 编译ActiveX项目生成dll文件    然后我们启动命令行CMD(如果是Vista/Win 使用管理员方式打开) 使用以下命令注册控件     C:\\>D:                       //转到 dll所在目录 笔者为了方便将 dll copy到了D盘根目录    D:\\>regasm activexofbosnma dll /codebase /tlb    *regasm命令在%systemroot%\\Microsoft NET\\Framework\\v x xxxx\\目录下 将该目录注册到用户环境变量中即可不使用完全限定名运行该命令     *使用regasm activexofbosnma dll /codebase /tlb /unregister可以反注册 在ActiveX代码变更时重编译后 需要先反注册再注册     图 注册和反注册ActiveX控件    测试ActiveX    最后我们创建一个页面来测试该ActiveX     <>    <headrunat= server >    <title></title>    <objectid= myAcX name= myAcX classid= clsid: E CE EC b B C FFC A >    </object>    <scriptlanguage= javascript for= myAcX type= text/javascript event= OnRecorderVolumeChanged(v); >    MyDiv innerHTML = In javascript: Get Volume: +v;    </script>    <scriptlanguage= javascript for= myAcX type= text/javascript event= OnRecorderStarted >    MyDiv innerHTML = In javascript: OnRecorderStarted ;    </script>    <scriptlanguage= javascript for= myAcX type= text/javascript event= OnRecorderStopped >    MyDiv innerHTML = In javascript: OnRecorderStopped ;    </script>    </head>    <body>    <form>    <scriptlanguage= javascript type= text/jscript >    function Button _onclick()     myAcX Start();        function Button _onclick()     myAcX Stop();        function RecorderVolumeChanged(v)     alert( volume: + v);        </script>    <divid= MyDiv >Nothing happened</div>    <p>    <inputid= Button type= button value= Start onclick= Button _onclick() />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    <inputid= Button type= button value= Stop onclick= Button _onclick() /></p>    </form>    </body>    </>     测试效果    首先使用IE打开测试页面    允许ActiveX交互后进入主界面 点击Start按钮会收到ActiveX返回的OnRecorderStarted事件     三秒过后收到Volume事件    最后点击Stop按钮会收到OnRecorderStopped事件     安全性    为了标记ActiveX控件为安全的(避免弹出 该控件是不安全的 警告) 需要实现IObjectSafety接口     using System;    using System Collections Generic;    using System Runtime InteropServices;    using System ComponentModel;    using System Text;    namespace ActiveXOfBosnMa        [    Serializable     ComVisible(true)    ]    publicenumObjectSafetyOptions        INTERFACESAFE_FOR_UNTRUSTED_CALLER = x     INTERFACESAFE_FOR_UNTRUSTED_DATA = x     INTERFACE_USES_DISPEX = x     INTERFACE_USES_SECURITY_MANAGER = x     ;    //    // MS IObjectSafety Interface definition    //    [    ComImport()     Guid( CB BDC C CF F F CD )     InterfaceType(ComInterfaceType InterfaceIsIUnknown)    ]    publicinterfaceIObjectSafety        [PreserveSig]    long GetInterfaceSafetyOptions(refGuid iid outint pdwSupportedOptions outint pdwEnabledOptions);    [PreserveSig]    long SetInterfaceSafetyOptions(refGuid iid int dwOptionSetMask int dwEnabledOptions);    ;    //    // Provides a default Implementation for    // safe scripting     // This basically means IE won t plain about the    // ActiveX object not being safe    //    publicclassIObjectSafetyImpl : IObjectSafety        privateObjectSafetyOptions m_options =    ObjectSafetyOptions INTERFACESAFE_FOR_UNTRUSTED_CALLER |    ObjectSafetyOptions INTERFACESAFE_FOR_UNTRUSTED_DATA;    #region [IObjectSafety implementation]    publiclong GetInterfaceSafetyOptions(refGuid iid outint pdwSupportedOptions outint pdwEnabledOptions)        pdwSupportedOptions = (int)m_options;    pdwEnabledOptions = (int)m_options;    return ;        publiclong SetInterfaceSafetyOptions(refGuid iid int dwOptionSetMask int dwEnabledOptions)        return ;        #endregion    ;        并实现以下两个方法:    #region Implementation of IObjectSafety    privateObjectSafetyOptions m_options =    ObjectSafetyOptions INTERFACESAFE_FOR_UNTRUSTED_CALLER |    ObjectSafetyOptions INTERFACESAFE_FOR_UNTRUSTED_DATA;    publiclong GetInterfaceSafetyOptions(refGuid iid outint pdwSupportedOptions outint pdwEnabledOptions)        pdwSupportedOptions = (int)m_options;    pdwEnabledOptions = (int)m_options;    return ;        publiclong SetInterfaceSafetyOptions(refGuid iid int dwOptionSetMask int dwEnabledOptions)        return ;        #endregion cha138/Article/program/net/201311/13191

相关参考

知识大全 软件代码数字签名和 ActiveX 控件基础知识

软件代码数字签名和ActiveX控件基础知识  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么

知识大全 用C#编写ActiveX控件

用C#编写ActiveX控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!首先建立一个WinFor

知识大全 C#开发ActiveX控件操作指南

C#开发ActiveX控件操作指南  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#开发Act

知识大全 C#用Activex实现Web客户端读取RFID功能

C#用Activex实现Web客户端读取RFID功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 用导航组件来构建动态 Portal 菜单

用导航组件来构建动态Portal菜单  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介Grid

知识大全 C#中构建多线程应用程序

C#中构建多线程应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言  随着双核四核等多

知识大全 c#中构建异常处理

  异常是程序运行中发生的错误异常处理是程序设计的一部分在c#中异常处理是通过Exception基类进行的可以创建自己的异常类但这个类必须是继承自Exception基类  异常将导致不完善或者不需要的

知识大全 用Visual C#动态生成组件

用VisualC#动态生成组件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  通常在写程序的时候

知识大全 asp调用c#编制的com组件实例

 新建类库MyTestDLL  右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册”  打开 AssemblyInfocs&nb

知识大全 通过企业服务总线构建事件驱动的体系结构

  作者LucasJellemaOracleACE和Oracle融合中间件区域总监  通过一个简单的示例了解如何配置ESB以发布企业事件  年月发表  在面向服务的体系结构(SOA)领域一个比较重要的