最近做项目的时候需要开发Actviex,开发Actviex一般会使用C++,DELPHI,或则VB。C#开发的话,客户端需要装.NET框架,所以我放弃C#,后来打算使用C++(对C++略懂)。按照http://www.codeproject.com/KB/COM/CompleteActiveX.aspx提供的资料做了下。哎,C++我真不会。于是还是考虑VB了。VB之前还学过,也用过段时间,也算相识。
赶紧下载了VB,安装运行,见到久违的界面。我们新建“ActiveX 控件”
代码过程就不详细描述了。主要有几点提示下。
1:操作DOM
Set clientIDEle = UserControl.Parent.Script.document.createElement("INPUT") clientIDEle.Name = "ClientID" clientIDEle.Value = clientID clientIDEle.Type = "hidden" If UserControl.Parent.Script.document.Forms.length > 0 Then UserControl.Parent.Script.document.Forms(0).appendChild (clientIDEle) Else UserControl.Parent.Script.document.body.appendChild (clientIDEle)
UserControl.Parent获取Activex所在的DOM,并调用脚本document.createElemtn创建元素INPUT。最后使用appendChild附加元素到DOM。
这个基本和我们在javascript操作dom是差不多的。
2:调用客户端脚本
UserControl.Parent.Script.OnActivexShow
OnActivexShow就是我在定义的一个Javascript的方法。
function OnActivexShow() { if (!isErrorInstall) { alert("success"); } else { alert("Fail"); } }
程序编写好后,按F5 ,VB会打开浏览器。
我们查看这个网页的源:
<HTML><BODY><OBJECT classid="clsid:55C578E6-C80E-41A1-B1D8-664EE3DF9AF5"> </OBJECT></BODY></HTML>
classid是这个控件的ID,如果你更改了代码,这个ID都会改变。其实我不希望他改变,所以我们需要在工程属性里的部件选择工程兼容,后面编译的话就选择二进制兼容。如图:
我们做好了控件以后,我们需要生成一个.ocx的文件。在文件菜单选择生成****.ocx
这样一个activex控件就做好了。然而我们需要把它放到网上是还有一些工作要做的,制作CAB安装包,签名。我们先制作CAB安装包先。
制作CAB之前,需要编写一个inf文件,说明这个包内的文件是否注册,解压目录,文件版本的信息。
[version] Signature="$Chicago$" AdvancedINF=1.0 [DefaultInstall] CopyFiles=install.files RegisterOCXs=RegisterFiles [RInstallApplicationFiles] CopyFiles=install.files RegisterOCXs=RegisterFiles [DestinationDirs] install.files=11 [SourceDisksNames] 1=%DiskName%,YLSoftSSO.CAB,1 [Add.Code] YLSoftSSO.ocx=YLSoftSSO.ocx YLSoftSSO.inf=YLSoftSSO.inf CPUID_Util_VB.dll = CPUID_Util_VB.dll [install.files] YLSoftSSO.ocx=YLSoftSSO.ocx YLSoftSSO.inf=YLSoftSSO.inf CPUID_Util_VB.dll = CPUID_Util_VB.dll [SourceDisksFiles] YLSoftSSO.ocx=1 YLSoftSSO.inf=1 CPUID_Util_VB.dll = 1 [YLSoftSSO.ocx] file=thiscab clsid={7EF60A65-EB2A-464B-9F0A-D25FB5A3E429} RegisterServer=yes DestDir=11 FileVersion=1,0,0,0 [CPUID_Util_VB.dll] file-win32-x86=thiscab DestDir=11 RegisterServer=yes FileVersion=1,0,0,0 [YLSoftSSO.inf] file=thiscab [RegisterFiles] %11%\YLSoftSSO.ocx
注释:"thiscab" 是一个关键字,意指包含该INF的CAB文件。也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可。
file-win32-x86指定平台是 x86。文件版本号可见属性。"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/ /SYSTEM32;64位系统安装后好像是放在C:\Windows\SysWOW64
"clsid" 指的是要安装控件的CLSID。这样我们就可以打包CAB了。
我们运行CMD执行iexpress命令。
步骤如图:
2:选中Create compressed files only(ACTIVEX installs)
3:添加文件到CAB,包括info,ocx,还有工程引用的dll
4:选择存放路径,并选中Store files using Long File name inside Package
5:选择Don’t Save。然后下一步,下一步,完成。
http://dl.dbank.com/c00ax6t4sq
CAB包已经搞定了,现在解决的是签名问题。如果Activex没有签名的话,可能会出现
你可以在控制台使用下面的命令检测OCX签名
chktrust test.cab
如果想弄一个签名的控件的话,你必须从一些认证机构,例如Thawte,Verisign和GeoTrust,获得代码签名证书(Code Signing Certificate)。这些机构会提供证书文件给你,一般是*.spc,*.pvk。然后使用signcode签名控件即可。
1: .net sdk提供了makecert.exe程序,供你制作的自己的数字证书,这个证书不属于受信任的证书。使用帮助请查看http://msdn.microsoft.com/zh-cn/library/bfsktky3.aspx
这里我们也创建一个。
在控制台运行
makecert -sv test.pvk -n "CN=YLSoft" test.cer
makecert参数中
其中sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置,-sv 导出私钥文件(为了签名使用)。注意:这个时候会让输入三次密码,三次要完全一致。 2:使用Cert2Spc生成spc发行者证书(可选):cert2spc test.cer test.spc
下面提供几个时间戳地址:
VeriSign: http://timestamp.verisign.com/scripts/timstamp.dll
Comodo: http://timestamp.comodoca.com/authenticode
GeoTrust/TrustCenter: http://www.trustcenter.de/codesigning/timestamp
签名弄好以后,查看文件属性,会多加一个“数字签名” 选项卡。
其实证书按照上面操作后还是不能够正常验证的,只是了解如何注册证书。申请证书是需要钱的,我找了下网上的一些注册免费证书的方法。有些使用支付宝的个人证书,我这里使用修改注册表的方法来解决的。
我们启动VISUAL STUDIO新建一个Setup Project。
在项目文件加入刚做好的OCX控件文件。
我们切换试图到注册表试图
加入如下图的键值。其中{55C578E6-C80E-41A1-B1D8-664EE3DF9AF5}是我们OCX的ID。
这样在每个客户端下载此exe安装包,安装就可以使用这个ACTIVEX 控件了。
页面使用ACTIVEX控件 。
<OBJECT id="axACCard1" onerror="ActivexError()" codebase="SSO.CAB#version=1,0,0,0" classid="clsid:55C578E6-C80E-41A1-B1D8-664EE3DF9AF5"> </OBJECT> onerror在控件出错,或则是未安装ACTIVEX时执行。
我们可以执行ACTIVEX 的方法
document.getElementById("axACCard1").SetK3NoLoginInfo("a","b","c","ss","bbb");
document.getElementById("axACCard1").SetLogin(true);
var clientID= document.getElementById("axACCard1").GetCPUIDProxy();