Activex开发备忘录

最近做项目的时候需要开发Actviex,开发Actviex一般会使用C++,DELPHI,或则VB。C#开发的话,客户端需要装.NET框架,所以我放弃C#,后来打算使用C++(对C++略懂)。按照http://www.codeproject.com/KB/COM/CompleteActiveX.aspx提供的资料做了下。哎,C++我真不会。于是还是考虑VB了。VB之前还学过,也用过段时间,也算相识。

赶紧下载了VB,安装运行,见到久违的界面。我们新建“ActiveX 控件”

image

代码过程就不详细描述了。主要有几点提示下。

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会打开浏览器。

image 

我们查看这个网页的源:

<HTML><BODY><OBJECT classid="clsid:55C578E6-C80E-41A1-B1D8-664EE3DF9AF5">

</OBJECT></BODY></HTML>

classid是这个控件的ID,如果你更改了代码,这个ID都会改变。其实我不希望他改变,所以我们需要在工程属性里的部件选择工程兼容,后面编译的话就选择二进制兼容。如图:

image

我们做好了控件以后,我们需要生成一个.ocx的文件。在文件菜单选择生成****.ocx

image

这样一个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命令。

步骤如图:

1:
image

2:选中Create compressed files only(ACTIVEX installs)
image 
3:添加文件到CAB,包括info,ocx,还有工程引用的dll
image
4:选择存放路径,并选中Store files using Long File name inside Package
image
5:选择Don’t Save。然后下一步,下一步,完成。

image 
http://dl.dbank.com/c00ax6t4sq
CAB包已经搞定了,现在解决的是签名问题。如果Activex没有签名的话,可能会出现
image 

你可以在控制台使用下面的命令检测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

3:使用signcode签名
image 

选择需要注册签名的cab,或则ocx文件
image

image

选择cer证书文件
image 
选择 pvk文件
image
image
image
image
image
image

下面提供几个时间戳地址:
VeriSign:  http://timestamp.verisign.com/scripts/timstamp.dll
Comodo: http://timestamp.comodoca.com/authenticode
GeoTrust/TrustCenter: http://www.trustcenter.de/codesigning/timestamp

image
image
image

签名弄好以后,查看文件属性,会多加一个“数字签名” 选项卡。

image

查看证书
image
image

选择证书存放的位置“受信任的证书颁发机构”
image
image

其实证书按照上面操作后还是不能够正常验证的,只是了解如何注册证书。申请证书是需要钱的,我找了下网上的一些注册免费证书的方法。有些使用支付宝的个人证书,我这里使用修改注册表的方法来解决的。
我们启动VISUAL STUDIO新建一个Setup Project。
image
在项目文件加入刚做好的OCX控件文件。
image
我们切换试图到注册表试图
image 

加入如下图的键值。其中{55C578E6-C80E-41A1-B1D8-664EE3DF9AF5}是我们OCX的ID。
image
这样在每个客户端下载此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();


你可能感兴趣的:(ActiveX)