C#实现ActiveX控件开发与部署
现在,我们手里已经有了这个控件包:QRCode.cab,下面我们编写一个测试的网页
<html>
<head>
<title>无标题页</title>
<script type="text/javascript" language="javascript"> function Test()
{
qrcodeocx.DecodeQRCode("@UEsDBBQAAAAIADWPjj3wRxgnaAAAAKQAAAAIAAAAemlwRW50cnktjdsNAjEQA1uhgJxke1/ZpDVEOTRBcwR0fzOWZVNowLnTlVkxN+1OSCOAH4TJDvwd+zaBuFCX7EFf8hW1P2/KPHITYmOiFypq1qBiMIL2PAHFERgEw1+jCY9WnsrZBc8LNcGanXl2vlBLAQIUABQAAAAIADWPjj3wRxgnaAAAAKQAAAAIAAAAAAAAAAAAAAAAAAAAAAB6aXBFbnRyeVBLBQYAAAAAAQABADYAAACOAAAAAAA=#"); if(qrcodeocx.Flag)
{
alert("成功!返回"+qrcodeocx.Result);
document.getElementById("txt").value = qrcodeocx.Result;
}
else
{
alert("失败!原因:"+qrcodeocx.ExceptionMsg);
}
}
</script> </head>
<body>
<div>
<object id="qrcodeocx" codebase="QRCode.cab#version=1,0,0,0" classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"></object>
</div>
<input id="Button1" type="button" value="测试" onclick="javascript:Test();" />
<textarea id ="txt"></textarea>
</body>
</html>
codebase="QRCode.cab#version=1,0,0,0" 指明了引用控件包的位置和版本(用于控件的升级,后面会讲)
classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"就是之前我们编写控件时候,控件的guid
这样我们就可以在本地或者发布到iis上测试一下。
过程中因为签名等问题有可能会提示安全受限或者无法安装之类的,如果你不想一点一点的调整ie安全设置就直接将站点设置为可信站点,并调低安全级别。
然后打开浏览器,提示控件安装,点击“安装”
这样控件就部署安装完成,也就可以使用js调用了。
但是,如果以后我们的控件需要升级,怎么办呢?如果使用以上介绍的方法进行控件的部署,需要按照下列步骤进行升级工作:
1、更新Activex的版本:
(1)在ActiveX项目上点右键,属性,应用程序,程序集信息,最初的版本是1.0.0.0,修改为1.0.1.0
(2)重新生成。
2、修改安装程序
(1)添加注册表项
在项目上点右键,视图,注册表:
在HKEY_CLASSES_ROOT下创建CLSID/{ActiveX的GUID}/InstalledVersion/,
在InstalledVersion下新建字符串值,修改字符串的值为”1,0,1,0″,
注意:删除名称中的值,自动会显示“(默认值)”,这样才能设置注册表中默认值,不要自己输入“默认值”。
(2)修改安装程序版本
修改Version为”1.0.1″,修改RemovePreviousVersions为”True”。
(3)重新生成安装程序
3、重新制作CAB安装包
4、修改网站代码
(1)将生成的CAB安装包替换原来的安装包。
(2)修改页面控件版本
<object id="qrcodeocx" codebase="QRCode.cab#version=1,0,1,0" classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"></object>
这样当下一次浏览器刷新的时候,就会比较这个版本,并进行相应的升级。这里的升级其实涉及了两部分的是升级,一部分是cab的升级,另一部分是msi的升级,所以这里要了解两组升级比较的概念——更新cab的版本和registry的版本:
首先說說cab的版本
cab的版本(即html裏codebase的版本)是會和客戶這兩條registry進行配對
HKCR/CLSID/{GUID}/InstalledVersion
或
HKCU/Software/Classes/{GUID}/InstalledVersion/(Default)
也就是說,我們需要在安裝msi的時候,在客戶裏寫進這條registry
方法如下︰
在ActiveX Setup安装項目點擊右鍵 –> 视图–> 注册表里添加
生成以後,在安裝msi的時候,regisry便會被寫進客戶的機器
(請注意,[ComRegisterFunction()]這個方法是不行的,因為安裝msi的時候不會執行)
例如︰
請以ActiveX控件的GUID代替以下的GUID,並請保留Registry裏的{}
Registry: HKCR/CLSID/{GUID}/InstalledVersion/(Default) = “1,2,0,0″
Html: classid=”clsid:GUID” codebase=”YourProduct.cab#version=1,2,0,0″
這樣客戶在瀏覽你的網頁時,便會把html裏codebase的版本和Registry的版本進行配對,如html的版本較registry的版本新,便會下載並執行cab檔案
第二點是msi的版本
ActiveX Setup項目 –> 属性 –> 版本
這個版本要比客戶的版本較新,否則在執行msi時便會安裝失敗
另外,也要把移除上一版本”设置为 true
以下是這兩項設置的目的︰
1. html會和客戶的registry的版本進行配對,發現html的版本較客戶的版本新時,便會下載cab
2. 下載cab後,便會根據inf執行msi or bat檔案,執行msi時,它會自行和上一次安裝的msi版本進行配對,今次的版本較新時,才會繼續安裝
因此兩者也必須更新
順帶一提,如果不寫registry,html是配對的對象會變成.net framework的版本,就是2,0,50727那個,暫時還不知原因
參考:
cab和registry的配對
http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/48335861-2434-4058-9809-186a0bd9e320/
在msi裏添加registry
http://stackoverflow.com/questions/1506858/how-to-get-com-server-for-excel-written-in-vb-net-installed-and-registered-in-aut
C#实现ActiveX控件开发与部署的更多相关文章
- C#ActiveX控件开发学习
一:C#ActiveX控件开发注意事项 1:C#开发的ActiveX控件只可在装有Framework的系统上才能用. 2:只有IE浏览器支持. 3:初次安装需要导入代码签名证书及其证书链的方式, ...
- 最全的基于MFC的ActiveX控件开发教程
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- ActiveX控件开发 C#
转自:http://hi.baidu.com/charlesx_kst/item/9c2f42e2920db3f42b09a4ff 前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如 ...
- 基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- 【转载】基于MFC的ActiveX控件开发(3)
原文:http://iysm.net/?p=122 3.事件 ActiveX 控件使用事件通知容器控件上发生了某些事情.事件的常见示例包括单击控件.使用键盘输入数据和控件状态更改.当发生这些操作时,控 ...
- 【转载】基于MFC的ActiveX控件开发(1)
原文:http://iysm.net/?p=114 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一 ...
- ActiveX控件开发
VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...
- C#ActiveX控件开发
1.新建项目,选择C#,选择.NET Framework2.0,新建一个Windows窗体控件库项目,命名为ActiveXDemo; 2.右击ActiveXDem项目,选择属性——应用程序——程序集信 ...
- MFC-[转]基于MFC的ActiveX控件开发
作者:lidan | 出处:博客园 | 2012/3/13 16:10:34 | 阅读22次 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC ...
随机推荐
- 三层与MVC
三层架构(3-tier architecture) 我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C语言初学者代码中的常见错误与瑕疵(3)
问题: n-1位数字 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数. 输入: 第一行为M,表示测试数据组数. 接下来M行,每行包含一个测 ...
- Android 带checkbox的listView 实现多选,全选,反选
由于listview的一些特性,刚开始写这种需求的功能的时候都会碰到一些问题,重点就是存储每个checkbox的状态值,在这里分享出了完美解决方法: 布局文件: [html] <?x ...
- 对比其它软件方法评估敏捷和Scrum
一般来说,选择一种软件开发方法,更像是加入一个邪教组织,而不像是做出了一个技术决策.许多公司甚至从未试图去评估这些方法,而仅仅是盲目采用最流行的方法,这就造成了如今五花八门的各种敏捷方法.因此本文将使 ...
- Spring+Mybatis整合报错Mapped Statements collection does not contain value原因之一
报错如下: ### Error updating database. Cause: java.lang.IllegalArgumentException: Mapped Statements coll ...
- c++ 程序在内存中的分布
从低地址到高地址: 1.代码区[包含常量的]:存放函数体的二进制代码 2.全局变量区[已初始化 + 未初始化]: 全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量在一块区域, 未初始化的 ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
- ASP.NET数据验证控件的常用的属性
一.非空验证 RequiredFieldValidator ControlToValidate 所验证的控件ID Text 出错时的提示的文本 ErrorMessage 提交给Validati ...
- android异步加载图片并缓存到本地实现方法
图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片 在android项目中访问网络图片是非常普遍性的事 ...