为ActiveX控件创建网页
光完成了ActiveX控件还不行,因为ActiveX控件无法单独运行,所以我们还需要为ActiveX控件创建相应的测试页面。如果想为我们的ActiveX控件创建一个默认的测试页面,非常好的的工具就是Microsoft ActiveX Control Pad。这是一个免费的工具,我们可以从微软的网站上下载得到。
我们需要下载ActiveX Control Pad并将它安装在我们的开发机器上。同时为了简化测试工作,我们还需要在同一台机器上安装微软的IIS服务器作为Web服务器。
当我们第一次运行ActiveX Control Pad的时候,它将创建一个默认的HTML页面。接下来,我们需要将ActiveX控件插入到这个页面中。在<BODY>标签内的某个位置右键单击,选择“Insert ActiveX Control”,在弹出的“Insert ActiveX Control”对话框中,选中我们刚刚创建的ActiveX控件MyActiveX,然后点击“OK”关闭对话框,将ActiveX控件插入到页面中。
图5 插入ActiveX控件
ActiveX Control Pad提供了两个对话框,供我们对ActiveX控件的各个属性进行修改编辑。属性对话框用于修改ActiveX控件的各项属性。而“编辑ActiveX控件(Edit ActiveX Control)”对话框用于手动地对ActiveX控件进行修改。当然,我们也可以不使用对话框,直接编辑HTML代码达到相同的效果。在代码中找到OBJECT ID标签,如下图6所示,修改它的尺寸参数为“WIDTH=350”和“HEIGHT=50”。完成代码的修改后,将这个文件保存为myactivex.htm,放置到IIS服务器的网站根目录wwwroot下。
图6 在ActiveX Control Pad中编辑页面
现在,我们就可以使用IE打开http://localhost/myactivex.htm对ActiveX控件进行测试了。在ActiveX控件加载的过程中,如果你得到一些警告消息,点击“OK”略过就可以了。正常情况下,你将看到页面中显示的一个进度条GIF动画。如果你没有看到动画,或者是仅仅在ActiveX控件的位置显示一个红色的叉叉,这可能是你的浏览器的安全设置,阻止了ActiveX控件的加载和运行。要解决这个问题,请修改你的浏览器的安全设置,使其所有关于ActiveX的选项都在“允许(enabled)”状态。
图7 浏览器中的MyActiveX控件
接下来,我们将让我们的控件成为一个“签名的”或者是“安全的”控件,以此来解决在ActiveX控件加载过程中所产生的那些警告信息。
构建一个“签名的”ActiveX控件。要想创建一个“签名的”ActiveX控件,你必须从一些认证机构,例如Thawte,Verisign和GeoTrust,获得代码签名证书(Code Signing Certificate)。通过这项服务,他们将对你进行认证同时为你提供用于对ActiveX控件进行签名的证书文件。这些用于应用程序签名的证书文件包括mycert.spc和mykey.pvk.两个文件。
为了对ActiveX应用程序进行签名,我们需要将这个程序的所有组件打包成CAB文件。这个CAB文件将被从网站上下载到目标机器上,然后ActiveX控件会通过下载的CAB文件被安装到目标机器上。要启用这项功能,我们必须在ActiveX控件的版本信息VERSIONINFO结构体中定义OLESelfRegister变量。在VS 2003及其之前的Visual Studio之中,这一变量是被自动添加的。但是在Visual Studio 2005中,默认情况下VERSIONINFO结构体中并不包含这一变量,我们需要按照下面的示例手动添加OLESelfRegister这一变量:
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "TODO: <Company name>"
VALUE "FileDescription", "TODO: <File description>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "MyActiveX.ocx"
VALUE "LegalCopyright",
"TODO: (c) <Company name>. All rights reserved."
VALUE "OLESelfRegister", "\0"
VALUE "OriginalFilename", "MyActiveX.ocx"
VALUE "ProductName", "TODO: <Product name>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
在签名ActiveX控件之前,ActiveX控件应该被打包成CAB文件。这个CAB文件同样还包含一个INF文件,它将用于安装你的ActiveX控件。要创建CAB文件,你需要Microsoft Cabinet Software Development Kit中的cabarc.exe。下面的INF文件演示了如何将我们的MyActiveX控件打包到CAB文件中。对于其中的CLSID,你需要将其修改为跟之前我们使用ActiveX Control Pad创建的HTML页面中OBJECT ID相同的值。
myactivex.ocx=myactivex.ocx
myactivex.inf=myactivex.inf
[myactivex.ocx]
file=thiscab
clsid={36299202-09EF-4ABF-ADB9-47C599DBE778}
RegisterServer=yes
FileVersion=1,0,0,0
[myactivex.inf]
file=thiscab
我们可以通过下面的DOS命令创建CAB文件。这里需要注意的是:OCX文件和INF文件必须跟你所执行的cabarc.exe在同一个目录,否则CAB文件在被下载后将无法正确的解压缩。这也是一个导致ActiveX控件被显示为红色叉叉的重要原因。
cabarc -s 6144 N myactivex.cab myactivex.ocx myactivex.inf
要对我们刚刚创建的CAB文件进行签名,我们需要Microsoft MSDN为我们提供的工具signcode.exe 。(请查阅本文末尾与“Signing and Checking with Authenticode”相关的参考资料) 。通过这个工具,我们就可以用我们从认证机构获得的代码签名证书对CAB文件进行签名了。下面是一个使用signcode对myactivex.cab进行签名的例子:
http://www.myactivex.com -spc mycert.spc -v mykey.pvk -t http://timestamp.verisign.com/scripts/timstamp.dll myactivex.cab
在上面的例子中,http://www.myactivex.com应该被替换成你的ActiveX控件的说明页面,通过这个页面,你可以为用户提供更多的关于这个控件的信息。
要使用签名过后的CAB文件,首先我们需要将myactivex.cab复制到web服务器的一个合适的目录下,然后我们修改Web页面中的OBJECT ID标签,添加一个参数CODEBASE指向CAB文件。具体代码如下图8所示。这样,当你再使用IE打开这个页面时,CAB文件会被下载,然后ActiveX控件会被正确的安装到你的机器上。在安装的过程中,再也不会弹出提示未签名ActiveX控件的警告信息了。
图8 添加CODEBASE参数