最近学习DelphiXE7下Intraweb开发,Intraweb完全服务器端运行使得FastReport报表系统无法在客户端运行,当然网上也有一大堆解决方案,例如导出到PDF后,给出连接,让客户点击下载等,个人感觉不完美。由于我做的B/S系统主要运行在windows平台,所以还是考虑ActiveX插件,来的直观。
一、DelphiXE7下 ActiveX开发
1、new-other-打开窗口,选择ActiveX Library,点击OK按钮
2、出现这样一个界面,此时Delphi建立一个无窗口的框架,生成3个单元:_TLB,.ridl及工程文件
3、点击 新建项 按钮,并选择第一个Active Form 点击确定
4、此时Delphi为我们建立了一个窗口,这里就是我们要实现功能的地方,我在这个窗口里面添加了ado连接,adodataset,报表控件及一个按钮,窗口名称我命名为pgform
5、为我们的ActiveX插件添加属性及方法:点击ridl单元在ipgform,在这个ActiveX form的接口部分右击,弹出菜单,这里可以为这个插件添加新的接口,属性,及方法,数据模块等
6、注意右边的Type属性里面要选择BSTR(delphi里面的wideString),点击上面的刷新按钮,delphi会在unit1里面自动添加此属性的实现方法的框架
这里,我将这个新添加的属性命名为SQL,并在form 的private部分添加一个私有成员_sql用来保存这个属性值。同时用同样的方法,我添加一个方法ShowS,此时可以实现这个ShowS方法,完成一定的功能。这个属性和方法可以被Intraweb调用,后面再讲调用如何调用
7、在_TLB单元找到这个form的GUID(这个单元里面有很多GUID,记住是form的,不是其他的),这个GUID很重要,在下面的Intraweb里面调用ActiveX时需要用到。在本例当中就是最下面那个GUID,CLASS_pgform:TGUID=xxxxxxxxxxxxxxx
8、完成上面的属性和方法功能后,可以保存项目了,然后编译生成OCX文件
二、在Intraweb中调用ActiveX
1、新建Intraweb项目就不说了,在窗口中添加一个IWACtiveX控件,这个控件就是用来加载我们的ActiveX的
这里主要设置两个属性:一是ClassID属性,二是CodeBase属性,ClassID就是我们上面提到的那个GUID,CodeBase就是要加载的OCX的文件名,本例中我用的是cab控价包。/files/zz.cab,其中 第一个正斜杠/ 代表着我们的DLL文件所在的文件夹(或者是wwwroot 文件夹),后面的files文件夹与我们DLL文件在同级文件夹中,当用户浏览次网页时,浏览器会提示安装ActiveX控件,选择安装即可。
重点内容:Intraweb调用ActiveX中的方法
我在IWForm的OnRender事件中写了下面的代码,当然也可以在其他地方写,如OnCreate,总之目的是给IWForm的JavaScript属性添加JavaScript代码。本例的代码是通过ID来查找网页中的ActiveX对象,赋值它的属性SQL,并调用它的方法ShowRP(上面说的是是ShowS,名字不同而已),字符串部分的代码要符合JavaScript语法,而不是delphi语法。本例中定义了一个JavaScript函数,这个函数调用我们的ActiveX控件的属性和方法,其实Intraweb中对ActiveX的访问,跟Intraweb无关,完全有JavaScript控制ActiveX,上面说的 IWActiveX控件只是负责用JavaScript语言在我们的网页中插入ActiveX对象,它访问不了ActiveX,只能用JavaScript访问ActiveX对象。
然后在IWBUTTON的ScriptEvents属性中调用这个JavaScript函数RepPrint();
这就是上面的IWACTIVEX控件的作用,用JavaScript语言插入一个ActiveX控件 ,剩下的事,他就做不了了。
下面说说如何创建cab及签名
三、创建cab及签名
1、创建cab
用windows自带的iexpress创建cab包,在开始,运行中输入iexpress 出现下面窗口
选择Create new创建一个新的,点击下一步
这里要选择最下面一个选项,创建一个自解压的ActiveX安装格式的cab,点击下一步
这里,点击add按钮选择刚才我们编译好的ocx文件,点击下一步
这里点击browse浏览文件夹,选择你想保存的位置及文件名,并把最下面一个复选框打钩,意思是保存长文件名
这个窗口意思是,是否保存这个cab的临时文件以备以后编辑,这里我选择了不保存,然后一直点击下一步就完成了
2、创建证书及签名
首先下载一个SignTool签名工具http://www.pfeng.org/tools/signtool.rar
然后在cmd命令窗口中键入:makecert -sv printocx.pvk -r -n
"CN=KeHong Company"
printocx.cer
这里的"CN=KeHong Company"
是签名名称可以随便改,pvk是密码文件,cer是证书文件,当然文件名你可以自己指定
点击回车键后,会出现一个窗口要求输入密码,这个窗口要出现三次,请输入相同的密码
确定以后,证书就创建完毕了
3、用这个证书签名我们的cab控件包
在我们下载的SignTool工具包中有一个签名工具signcode.EXE,运行它
点击下一步选择我们刚才建立的cab控件包,我这里选择的是OCX,方法是一样的,下一步
这里要选择自定,才可以在接下来的过程中选择我们刚才创建的cer证书文件
点击从文件选择,弹出窗口,选择我们刚才创建的cer证书文件并点击下一步
这里要求选择密码文件,就是我们创建证书时候同时生成的那个pvk文件,点击下一步
然后输入创建证书时候设定的密码,点击确定
随便选择一种加密算法,点击下一步
直接点击下一步
一路点击下一步,要求输入密码的时候输入密码,完成
四、证书的安装
上面叙述了ActiveX开发,cab打包,证书创建,签名及在Intraweb中调用ActiveX,其实很简单。
是不是这样就一定可以了呢?不一定!由于我们的cab签名不是信任机构签发的(据说弄一个信任机构颁发的证书年费就要400美元 ),所以还需要把签名cab控件包的cer证书安装到受信任的根证书区域,否则浏览器可能会阻止安装我们的ActiveX插件。
当浏览器阻止我们的插件时(客户端),会弹出一个窗口,上面有一个 “发布者”可以点击,然后可以查看这个插件签名的证书,点击查看证书,出现下面的窗口
点击安装证书,并选择第二个选项,指定位置安装
点击浏览按钮,出现选择证书的安装位置,此时要选择“受信任的根证书颁发机构”安装成功后,IE再次加载我们的ActiveX控件时,提示安装,点击安装即可。
五、OCX控件版本的控制
同一个CLASSID的ActiveX控件一旦注册到客户端机器中,每个支持OCX控件的浏览器都会自动加载。
但是如果我们的OCX控件功能升级了, 客户端使用的仍然是旧版本的OCX控件怎么办呢?总不至于在客户端电脑手动删除已注册的控件吧?解决的办法就是OCX的版本控制:同时改变OCX控件的文件版本和Intraweb中IWACTIVEX的CodeBase中的版本号可以达到此目的(这两个版本号一定要相同,否则客户端每次刷新页面,都要安装一次控件,挺烦人的哦)
1、改变OCX控件的文件版本号
在上面的ActiveX开发例子中,编译成OCX之前,点击project-options打开对话框,找到Version页,可以看到文件的版本号设定,如下图所示
主版本号默认是1,后面默认是0,改变这个版本号。这里,我把主版本号改为4,编译生成OCX
2、在Intraweb中改变CodeBase中的版本号
本例上面讲到的ActiveX调用中,CodeBase不带版本号,这里我们用下面所示的方法,加上版本号。#version=4,0意思是,让客户端浏览器在调用这个ocx时,检查已注册的ocx版本是否是4,0,如果是就调用,否则就重新下载安装。注意这里的4,0 中间是逗号,不是句号!
好了,重新编译这个dll,覆盖到网站根目录下,打开这个网页试试,浏览器会提示重新下载这个控件并安装。