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代码如下:3.7.2测试右键页面,在浏览器中查看如图3-23:图3-23浏览后我的IE出现了这样的界面如图3-24:图3-24这说明我的ActiveX没有在本机中注册。然后,我编译一下ActiveX工程之后,再次浏览网页,出现了一下界面如图3-253.7.3图3-25在IIS中发布网站依次截图如下如图3-26~3-图3-26图3-27图3-28图3-29图3-30图3-31图3-32图3-33打开IE输入:localhost:6789回车截图如3-34:(说明:6789是我在上面设置的端口号)图3-34以上,我们是在本机测试的,那么当我们用局域网里的一台机器(IP:192.168.2.17)测试的时候出现了下面的界面如图:3-35:说明:本机IP:192.168.2.16此时,局域网里的17机器也算是充当了客户机的身份图3-35这是因为控件没有在IP为:192.168.2.17上安装。为了能让客户机在访问服务器的时候,自动安装前面我们开发的ActiveX控件,我们应该把.msi文件打包成.cab文件。下面我们来看一下打包.cab。3.8打包.cab欲打包成.cab,我们需要做一下准备:3.8.1工具:使用CABSDK中的工具(下载地址3.8.23.8.3/kb/310618)用安装工程生成.msi安装文件创建并编写INF文件下面我们在该解决方案文件夹下建立一个cab文件夹,用来存放文件、.msi文件、.inf文件我们把下载下来之后,双击运行如图3-36:图3-36把UnizipToFolder:中的路径记录下来。路径:D:DOCUME~1ADMINI~ALS~1Temp然后点击Unzip按钮如图3-37:图3-37打开我的电脑,把刚才的路径复制粘贴进去,回车如图3-38:图3-38找到BIN文件,打开BIN文件夹如图3-39图3-39把拷贝到刚才建立的cab文件夹中,以方便使用(你也可以不拷贝,这只是我自己觉得方便罢了,意思是你要找到这个文件,下面做CAB文件的时候要用到。)生成.msi安装文件方法右键ActiveXSetup—>生成/重新生成如图3-40:3-40找到ActiveXSetup文件夹,我们可以看到生成了俩文件如图3-41:图3-41把.exe和.msi文件也拷贝到cab文件夹中去。创建并编写INF文件[version]signature="$CHICAGO$"AdvancedINF=2.0[SetupHooks]hook1=hook1[hook1]run=/i"%EXTRACT_DIR%"/qn创建cab文件的基本命令为:解析:-s6144:为签名留下6k的空间n创建是要创建的cab包;是安装工程生成的安装程序;是本人自己编写的inf文件;在具体使用的时候,我们最好给每个文件添加上响应的路径。具体看我的操作步骤。好了,到现在为止,制作cab包需要的3个东西都准备好了,依次是:、、如图3-42:图3-42本人建议先在记事本中把需要执行的命令写好,然后复制粘贴进去,直接回车运行。现在我们按照创建cab文件的基本命令语法来写命令我的这些文件全在E:DemoActiveXTestcab下,注意:要加上双引号命令如下:"E:"-s6144nE:::现在我们打开cmd如图3-43图3-43图3-44图3-45然后回车。图3-46到了这一步,本人就得到了cab包如图3-47:图3-47下面我们用客户机测试ActiveX的自动安装。3.9测试ActiveX的自动安装之前我们建立的ActiveXWebApp工程文件夹截图如下如图:3-48图3-48把刚才做好的cab包拷贝粘贴到ActiveXWebApp文件夹下如图3-49:图3-49然后,我们在工程中把cab包添加进来如图3-50:方法:右键ActiveXWebApp—>添加—>现有项如图3-51:图3-51图3-52这样操作之后,cab包就添加到工程中了如图3-53:图3-53然后,修改中的HTML代码,增添codebase代码,如图3-54~3-55:图3-54图3-55图3-56代码如下:我们再次用局域网中的17机器进行测试,当我们在客户机IE的地址栏中输入:192.168.2.16:6789回车之后,出现以下界面如图3-57:图3-57当我们单击“安装”稍等片刻就出现了如下界面如图3-58:图3-58到此,我们在VS2008下用C#开发ActiveX控件、以及开发好的ActiveX控件在客户端自动安装已经完全实现了。不知道大家注意到了没有,AcitveX控件确实是开发好了,那等以后,我们觉得这个控件有的地方需要改动,那改动后的AcitveX该如何安装到先前已经安装过本控件的客户机上呢?这就是ActiveX的自动更新。下面我们讲一下ActiveX的自动更新!四、ActiveX的自动更新我在网上搜索了一些关于自动更新ActiveX控件的资料:网址:/binwind/archive/2006/05/11/选取我们所需要的一段:(注意:如果你怕看了这些“摘录”方法影响你的思路,你也可以不看,直接看我的方法即可!)摘录:接下来是更新。用C#写的ActiveX的问题在于注册后所看见的ActiveX版本号也正是.netFramework的版本号,而不是Dll文件的版本号。所以用原来的ActiveX更新方式有问题。不过可以正好利用SetupProject的更新方式。进行更新。把SetupProject的RemovePreviousVersion属性设置为True这样。自动删除之前的版本。SetupProject是用一个GUID来标示是否是同一个SetUPProject。(注不是ActiveX的GUID)。所以在写了新的版本的时候。需要更新客户端的ActiveX可以使用如下步骤1.改变ActiveX的GUID(不是SetupProject)的GUID。2.提升SetupProject的版本号。3.改变网页中的ActiveX的classid为新的ActiveX的ID这个时候。当用户登陆网页时就会因为发现了新的ActiveX控件提示下载(GUID改变)。而下载后的安装程序使用SetupProject的GUID发现已经安装了旧版本。先卸载旧的安装版本。再卸载就安装版本的时候。已经自动地把久的ActiveX给注销了。不知道是本人理解错误还是怎么着,反正本人按照以上所说的方法没有达到更新的效果。下面本人就把自己实现自动更新的方法描述出来。首先,我们确定一下版本号如图4-1:方法:右键ActiveX工程属性,选择“应用程序”—>程序集信息(I)…如果不明白可以参见本文档中的图3-7和图3-8图4-1在客户机上我们查看以致确定安装成功的ActiveXSetup版本号如图4-2图4-2然后,我们更新我们刚才做好的ActiveX控件,本人这里只为ActiveX做了一点点改动,就是只添加了一个button控件,以及弹出一个MessageBox的消息框事件。如图4-3:图4-3控件做好后,我们更改控件的版本号以及GUID:更改版本号如图4-4:图4-4更改GUID也就是重新创建GUID,方法可以参考文档上面的图3-12和图3-13。然后一定要把控件类和页中的GUID写成新创建的GUID如图4-5:图4-5然后我们来更新安装程序:鼠标选中安装程序工程名同时按下F4快捷键,打开属性对话框如图4-6:请做一下更改:4.1RemovePreViousVersions属性改为True;4.2更改Version的值;图4-6当更改了Version的值之后,回车的时候,会弹出以下对话框如图4-7:图4-7这里我们选择“是”;然后,我们重新打包,重新发布,方法以上都说过了,这里我就不再赘述了!方法请参见:3.8打包.cab和3.9测试ActiveX的自动安装本人在客户机测试的结果如图4-8:点击安装。图4-8图4-9我们再看看添加/安装程序中ActiveXSetup的版本信息如图4-10:版本已经是我们更改过的2.0.0

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代码如下:3.7.2测试右键页面,在浏览器中查看如图3-23:图3-23浏览后我的IE出现了这样的界面如图3-24:图3-24这说明我的ActiveX没有在本机中注册。然后,我编译一下ActiveX工程之后,再次浏览网页,出现了一下界面如图3-253.7.3图3-25在IIS中发布网站依次截图如下如图3-26~3-图3-26图3-27图3-28图3-29图3-30图3-31图3-32图3-33打开IE输入:localhost:6789回车截图如3-34:(说明:6789是我在上面设置的端口号)图3-34以上,我们是在本机测试的,那么当我们用局域网里的一台机器(IP:192.168.2.17)测试的时候出现了下面的界面如图:3-35:说明:本机IP:192.168.2.16此时,局域网里的17机器也算是充当了客户机的身份图3-35这是因为控件没有在IP为:192.168.2.17上安装。为了能让客户机在访问服务器的时候,自动安装前面我们开发的ActiveX控件,我们应该把.msi文件打包成.cab文件。下面我们来看一下打包.cab。3.8打包.cab欲打包成.cab,我们需要做一下准备:3.8.1工具:使用CABSDK中的工具(下载地址3.8.23.8.3/kb/310618)用安装工程生成.msi安装文件创建并编写INF文件下面我们在该解决方案文件夹下建立一个cab文件夹,用来存放文件、.msi文件、.inf文件我们把下载下来之后,双击运行如图3-36:图3-36把UnizipToFolder:中的路径记录下来。路径:D:DOCUME~1ADMINI~ALS~1Temp然后点击Unzip按钮如图3-37:图3-37打开我的电脑,把刚才的路径复制粘贴进去,回车如图3-38:图3-38找到BIN文件,打开BIN文件夹如图3-39图3-39把拷贝到刚才建立的cab文件夹中,以方便使用(你也可以不拷贝,这只是我自己觉得方便罢了,意思是你要找到这个文件,下面做CAB文件的时候要用到。)生成.msi安装文件方法右键ActiveXSetup—>生成/重新生成如图3-40:3-40找到ActiveXSetup文件夹,我们可以看到生成了俩文件如图3-41:图3-41把.exe和.msi文件也拷贝到cab文件夹中去。创建并编写INF文件[version]signature="$CHICAGO$"AdvancedINF=2.0[SetupHooks]hook1=hook1[hook1]run=/i"%EXTRACT_DIR%"/qn创建cab文件的基本命令为:解析:-s6144:为签名留下6k的空间n创建是要创建的cab包;是安装工程生成的安装程序;是本人自己编写的inf文件;在具体使用的时候,我们最好给每个文件添加上响应的路径。具体看我的操作步骤。好了,到现在为止,制作cab包需要的3个东西都准备好了,依次是:、、如图3-42:图3-42本人建议先在记事本中把需要执行的命令写好,然后复制粘贴进去,直接回车运行。现在我们按照创建cab文件的基本命令语法来写命令我的这些文件全在E:DemoActiveXTestcab下,注意:要加上双引号命令如下:"E:"-s6144nE:::现在我们打开cmd如图3-43图3-43图3-44图3-45然后回车。图3-46到了这一步,本人就得到了cab包如图3-47:图3-47下面我们用客户机测试ActiveX的自动安装。3.9测试ActiveX的自动安装之前我们建立的ActiveXWebApp工程文件夹截图如下如图:3-48图3-48把刚才做好的cab包拷贝粘贴到ActiveXWebApp文件夹下如图3-49:图3-49然后,我们在工程中把cab包添加进来如图3-50:方法:右键ActiveXWebApp—>添加—>现有项如图3-51:图3-51图3-52这样操作之后,cab包就添加到工程中了如图3-53:图3-53然后,修改中的HTML代码,增添codebase代码,如图3-54~3-55:图3-54图3-55图3-56代码如下:我们再次用局域网中的17机器进行测试,当我们在客户机IE的地址栏中输入:192.168.2.16:6789回车之后,出现以下界面如图3-57:图3-57当我们单击“安装”稍等片刻就出现了如下界面如图3-58:图3-58到此,我们在VS2008下用C#开发ActiveX控件、以及开发好的ActiveX控件在客户端自动安装已经完全实现了。不知道大家注意到了没有,AcitveX控件确实是开发好了,那等以后,我们觉得这个控件有的地方需要改动,那改动后的AcitveX该如何安装到先前已经安装过本控件的客户机上呢?这就是ActiveX的自动更新。下面我们讲一下ActiveX的自动更新!四、ActiveX的自动更新我在网上搜索了一些关于自动更新ActiveX控件的资料:网址:/binwind/archive/2006/05/11/选取我们所需要的一段:(注意:如果你怕看了这些“摘录”方法影响你的思路,你也可以不看,直接看我的方法即可!)摘录:接下来是更新。用C#写的ActiveX的问题在于注册后所看见的ActiveX版本号也正是.netFramework的版本号,而不是Dll文件的版本号。所以用原来的ActiveX更新方式有问题。不过可以正好利用SetupProject的更新方式。进行更新。把SetupProject的RemovePreviousVersion属性设置为True这样。自动删除之前的版本。SetupProject是用一个GUID来标示是否是同一个SetUPProject。(注不是ActiveX的GUID)。所以在写了新的版本的时候。需要更新客户端的ActiveX可以使用如下步骤1.改变ActiveX的GUID(不是SetupProject)的GUID。2.提升SetupProject的版本号。3.改变网页中的ActiveX的classid为新的ActiveX的ID这个时候。当用户登陆网页时就会因为发现了新的ActiveX控件提示下载(GUID改变)。而下载后的安装程序使用SetupProject的GUID发现已经安装了旧版本。先卸载旧的安装版本。再卸载就安装版本的时候。已经自动地把久的ActiveX给注销了。不知道是本人理解错误还是怎么着,反正本人按照以上所说的方法没有达到更新的效果。下面本人就把自己实现自动更新的方法描述出来。首先,我们确定一下版本号如图4-1:方法:右键ActiveX工程属性,选择“应用程序”—>程序集信息(I)…如果不明白可以参见本文档中的图3-7和图3-8图4-1在客户机上我们查看以致确定安装成功的ActiveXSetup版本号如图4-2图4-2然后,我们更新我们刚才做好的ActiveX控件,本人这里只为ActiveX做了一点点改动,就是只添加了一个button控件,以及弹出一个MessageBox的消息框事件。如图4-3:图4-3控件做好后,我们更改控件的版本号以及GUID:更改版本号如图4-4:图4-4更改GUID也就是重新创建GUID,方法可以参考文档上面的图3-12和图3-13。然后一定要把控件类和页中的GUID写成新创建的GUID如图4-5:图4-5然后我们来更新安装程序:鼠标选中安装程序工程名同时按下F4快捷键,打开属性对话框如图4-6:请做一下更改:4.1RemovePreViousVersions属性改为True;4.2更改Version的值;图4-6当更改了Version的值之后,回车的时候,会弹出以下对话框如图4-7:图4-7这里我们选择“是”;然后,我们重新打包,重新发布,方法以上都说过了,这里我就不再赘述了!方法请参见:3.8打包.cab和3.9测试ActiveX的自动安装本人在客户机测试的结果如图4-8:点击安装。图4-8图4-9我们再看看添加/安装程序中ActiveXSetup的版本信息如图4-10:版本已经是我们更改过的2.0.0