知识大全 使用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() /> <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控件基础知识 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 什么
用C#编写ActiveX控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!首先建立一个WinFor
C#开发ActiveX控件操作指南 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C#开发Act
知识大全 C#用Activex实现Web客户端读取RFID功能
C#用Activex实现Web客户端读取RFID功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
用导航组件来构建动态Portal菜单 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 简介Grid
C#中构建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 随着双核四核等多
异常是程序运行中发生的错误异常处理是程序设计的一部分在c#中异常处理是通过Exception基类进行的可以创建自己的异常类但这个类必须是继承自Exception基类 异常将导致不完善或者不需要的
用VisualC#动态生成组件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 通常在写程序的时候
新建类库MyTestDLL 右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册” 打开 AssemblyInfocs&nb
作者LucasJellemaOracleACE和Oracle融合中间件区域总监 通过一个简单的示例了解如何配置ESB以发布企业事件 年月发表 在面向服务的体系结构(SOA)领域一个比较重要的