2023年6月21日发(作者:)
VS2008C#ActiveX控件开发总结——————EagleInSky——————2010-1-13一、前言ActiveX控件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。使用ActiveX插件,可以轻松方便的在Web页中插入多媒体效果、交互式对象以及复杂程序等等。通常使用C++或VB开发ActiveX控件,本文探讨一下在VisualStudio2008环境中使用C#开发ActiveX控件的技术实现。工作的需要,最近学习了一下C#ActiveX的开发,参照网上众多的资料,发现在VS2008下开发ActiveX的资料较少,本人现在现在做一个笔记,以备后用。其实用VS做一个ActiveX的安装项目,在客户机上双击运行安装.msi文件也是可以的,但是如果你的客户是在千里之外,难道每次更新的时候都要过去帮客户去安装吗?(客户毕竟有很多都不懂。)所以,手动安装实在是太不爽了。那么我们就实现一下ActiveX的自动安装吧。二、开发环境操作系统:Windows2003开发工具:版本:3.5开发语言:C#三、实现过程3.1运行MicrosoftVisualStudio2008,新建解决方案如图3-1:图3-1给解决方案命名为:ActiveXTest如图3-2:图3-23.2为解决方案添加一个Windows控件库项目,点击右键点击解决方案…如图3-3:图3-3并把控件库命名为ActiveX如图3-4:图3-4现在解决方案资源管理器的情况如图3-5:图3-53.3更改项目属性:右键点击“ActiveX”如图3-6:图3-6在VS的工作区域出现了如下图的界面如图3-7:图3-7单击“程序集信息(I)…”弹出“程序及信息”如图3-8:勾选“使程序集COM可见(M)”图3-8选择“生成”选项卡,并勾选“为COM互操作注册(P)”如图3-9:注意:此处是在debug状态下修改的,如果是调到release状态下,还需要再设置一下。图3-93.4修改文件如图3-10:图3-10引用命名空间:ty;添加:[assembly:AllowPartiallyTrustedCallers()]文件添加后如图3-11:图3-113.5为控件()添加内容把重命名为你需要的名字。这里我命名为:ActiveX。此ActiveX主要包括一个Button控件和一个TextBox控件,Button控件的Click事件是弹出一个MessageBox对话框,内容是TextBox中的内容。再添加一个公共方法。这样做可以达到两个目的:目的一:添加一个方法,供B/S前台程序直接调用,从而实现业务功能;目的二:ActiveX控件可以提供B/S程序UI界面,可以响应B/S程序中对UI的操作事件实现业务功能。为添加命名空间:pServices;首先:为控件创建GUID,这个编号将用于B/S系统的客户端调用时使用。创建方法:工具—>创建GUID(G)如图3-12~3-13:图3-12图3-13把GUID复制下来,放在类中:namespaceActiveX{[Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]publicpartialclassUserControl1:UserControl{……并添加Click方法,和公共方法ForDefault()privatevoidbutton1_Click(objectsender,EventArgse){("您想说:"+ng());}publicstringForDefault(){return"此方法用于在前台调用,以表明前台页面可以用JS调用控件类中的方法!!!";}做到这一步之后,ActiveX类的情况如图3-14:图3-14其次:为了让ActiveX控件获取客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意:不能修改该接口的GUID值)。创建接口:右键ActiveX工程—>添加—>新建项如图3-15~3-16:图3-15图3-16复制以下代码到中的相应位置:pServices;namespaceActiveX{[ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")][InterfaceTypeAttribute(aceIsIUnknown)]publicinterfaceIObjectSafety{[PreserveSig]intGetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]refintpdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]refintpdwEnabledOptions);[PreserveSig()]intSetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]intdwOptionSetMask,[MarshalAs(UnmanagedType.U4)]intdwEnabledOptions);}}然后,在ActiveX控件类中集成并实现接口:[Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]publicpartialclassUserControl1:UserControl,IObjectSafety{……并拷贝以下代码到控件类中:#regionIObjectSafety成员privateconststring_IID_IDispatch="{00020400-0000-0000-C0046}";privateconststring_IID_IDispatchEx="{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";privateconststring_IID_IPersistStorage="{0000010A-0000-0000-C0046}";privateconststring_IID_IPersistStream="{00000109-0000-0000-C0046}";privateconststring_IID_IPersistPropertyBag="{37D84F60-42CB-11CE-8135-00AA004BB851}";private0x00000001;private0x00000002;privateprivateprivateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=constintINTERFACESAFE_FOR_UNTRUSTED_DATA=constintS_OK=0;constintE_FAIL=unchecked((int)0x80004005);constintE_NOINTERFACE=unchecked((int)0x80004002);privatebool_fSafeForScripting=true;privatebool_fSafeForInitializing=true;publicintGetInterfaceSafetyOptions(refGuidriid,refintpdwSupportedOptions,refintpdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=ng("B");pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:Rslt=S_OK;pdwSupportedOptions=0;if(_fSafeForScripting==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForInitializing==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}publicintSetInterfaceSafetyOptions(refGuidriid,intdwOptionSetMask,intdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=ng("B");switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&&(_fSafeForScripting==true))Rslt=S_OK;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&&(_fSafeForInitializing==true))Rslt=S_OK;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}#endregion这样,一个ActiveX控件就开发完成了。3.6ActiveX控件部署ActiveX控件可以通过VisualStudio2008的“安装和部署”进行部署。需要注意的有两点:3.6.1将以上创建的用户控件项目作为主输出项目;3.6.2设置其Register属性为vsdrpCOM;首先,添加“安装和部署”工程。方法:右键“解决方案”—>添加—>新建项目如图3-17:图3-17图3-18添加项目主输出如图3-19~3-20图3-19图3-20设置Register属性为vsdrpCOM方法:在解决方案中选中“主输出来自ActiveX(活动)”如图3-21图3-213.7测试3.7.1建立Web应用程序项目建立一个Web应用程序项目,在测试页面的HTML代码中添加对ActiveX控件的引用,并可以通过Javascript调用控件的公共成员(注意这里的clsid后面的值就是前面为用户控件类设置的GUID)。方法:右键解决方案—>添加—>新建项目如图3-22:图3-22HTML代码如下:
2023年6月21日发(作者:)
VS2008C#ActiveX控件开发总结——————EagleInSky——————2010-1-13一、前言ActiveX控件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。使用ActiveX插件,可以轻松方便的在Web页中插入多媒体效果、交互式对象以及复杂程序等等。通常使用C++或VB开发ActiveX控件,本文探讨一下在VisualStudio2008环境中使用C#开发ActiveX控件的技术实现。工作的需要,最近学习了一下C#ActiveX的开发,参照网上众多的资料,发现在VS2008下开发ActiveX的资料较少,本人现在现在做一个笔记,以备后用。其实用VS做一个ActiveX的安装项目,在客户机上双击运行安装.msi文件也是可以的,但是如果你的客户是在千里之外,难道每次更新的时候都要过去帮客户去安装吗?(客户毕竟有很多都不懂。)所以,手动安装实在是太不爽了。那么我们就实现一下ActiveX的自动安装吧。二、开发环境操作系统:Windows2003开发工具:版本:3.5开发语言:C#三、实现过程3.1运行MicrosoftVisualStudio2008,新建解决方案如图3-1:图3-1给解决方案命名为:ActiveXTest如图3-2:图3-23.2为解决方案添加一个Windows控件库项目,点击右键点击解决方案…如图3-3:图3-3并把控件库命名为ActiveX如图3-4:图3-4现在解决方案资源管理器的情况如图3-5:图3-53.3更改项目属性:右键点击“ActiveX”如图3-6:图3-6在VS的工作区域出现了如下图的界面如图3-7:图3-7单击“程序集信息(I)…”弹出“程序及信息”如图3-8:勾选“使程序集COM可见(M)”图3-8选择“生成”选项卡,并勾选“为COM互操作注册(P)”如图3-9:注意:此处是在debug状态下修改的,如果是调到release状态下,还需要再设置一下。图3-93.4修改文件如图3-10:图3-10引用命名空间:ty;添加:[assembly:AllowPartiallyTrustedCallers()]文件添加后如图3-11:图3-113.5为控件()添加内容把重命名为你需要的名字。这里我命名为:ActiveX。此ActiveX主要包括一个Button控件和一个TextBox控件,Button控件的Click事件是弹出一个MessageBox对话框,内容是TextBox中的内容。再添加一个公共方法。这样做可以达到两个目的:目的一:添加一个方法,供B/S前台程序直接调用,从而实现业务功能;目的二:ActiveX控件可以提供B/S程序UI界面,可以响应B/S程序中对UI的操作事件实现业务功能。为添加命名空间:pServices;首先:为控件创建GUID,这个编号将用于B/S系统的客户端调用时使用。创建方法:工具—>创建GUID(G)如图3-12~3-13:图3-12图3-13把GUID复制下来,放在类中:namespaceActiveX{[Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]publicpartialclassUserControl1:UserControl{……并添加Click方法,和公共方法ForDefault()privatevoidbutton1_Click(objectsender,EventArgse){("您想说:"+ng());}publicstringForDefault(){return"此方法用于在前台调用,以表明前台页面可以用JS调用控件类中的方法!!!";}做到这一步之后,ActiveX类的情况如图3-14:图3-14其次:为了让ActiveX控件获取客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意:不能修改该接口的GUID值)。创建接口:右键ActiveX工程—>添加—>新建项如图3-15~3-16:图3-15图3-16复制以下代码到中的相应位置:pServices;namespaceActiveX{[ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")][InterfaceTypeAttribute(aceIsIUnknown)]publicinterfaceIObjectSafety{[PreserveSig]intGetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]refintpdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]refintpdwEnabledOptions);[PreserveSig()]intSetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]intdwOptionSetMask,[MarshalAs(UnmanagedType.U4)]intdwEnabledOptions);}}然后,在ActiveX控件类中集成并实现接口:[Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]publicpartialclassUserControl1:UserControl,IObjectSafety{……并拷贝以下代码到控件类中:#regionIObjectSafety成员privateconststring_IID_IDispatch="{00020400-0000-0000-C0046}";privateconststring_IID_IDispatchEx="{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";privateconststring_IID_IPersistStorage="{0000010A-0000-0000-C0046}";privateconststring_IID_IPersistStream="{00000109-0000-0000-C0046}";privateconststring_IID_IPersistPropertyBag="{37D84F60-42CB-11CE-8135-00AA004BB851}";private0x00000001;private0x00000002;privateprivateprivateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=constintINTERFACESAFE_FOR_UNTRUSTED_DATA=constintS_OK=0;constintE_FAIL=unchecked((int)0x80004005);constintE_NOINTERFACE=unchecked((int)0x80004002);privatebool_fSafeForScripting=true;privatebool_fSafeForInitializing=true;publicintGetInterfaceSafetyOptions(refGuidriid,refintpdwSupportedOptions,refintpdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=ng("B");pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:Rslt=S_OK;pdwSupportedOptions=0;if(_fSafeForScripting==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForInitializing==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}publicintSetInterfaceSafetyOptions(refGuidriid,intdwOptionSetMask,intdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=ng("B");switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&&(_fSafeForScripting==true))Rslt=S_OK;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&&(_fSafeForInitializing==true))Rslt=S_OK;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}#endregion这样,一个ActiveX控件就开发完成了。3.6ActiveX控件部署ActiveX控件可以通过VisualStudio2008的“安装和部署”进行部署。需要注意的有两点:3.6.1将以上创建的用户控件项目作为主输出项目;3.6.2设置其Register属性为vsdrpCOM;首先,添加“安装和部署”工程。方法:右键“解决方案”—>添加—>新建项目如图3-17:图3-17图3-18添加项目主输出如图3-19~3-20图3-19图3-20设置Register属性为vsdrpCOM方法:在解决方案中选中“主输出来自ActiveX(活动)”如图3-21图3-213.7测试3.7.1建立Web应用程序项目建立一个Web应用程序项目,在测试页面的HTML代码中添加对ActiveX控件的引用,并可以通过Javascript调用控件的公共成员(注意这里的clsid后面的值就是前面为用户控件类设置的GUID)。方法:右键解决方案—>添加—>新建项目如图3-22:图3-22HTML代码如下:
发布评论