Delphi XE7 开发ActiveX 及在IntraWeb下调试

时间:2021-03-24 00:54:55

最近学习DelphiXE7下Intraweb开发,Intraweb完全服务器端运行使得FastReport报表系统无法在客户端运行,当然网上也有一大堆解决方案,例如导出到PDF后,给出连接,让客户点击下载等,个人感觉不完美。由于我做的B/S系统主要运行在windows平台,所以还是考虑ActiveX插件,来的直观。
一、DelphiXE7下 ActiveX开发

1、new-other-打开窗口,选择ActiveX Library,点击OK按钮

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

2、出现这样一个界面,此时Delphi建立一个无窗口的框架,生成3个单元:_TLB,.ridl及工程文件

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

3、点击 新建项  按钮,并选择第一个Active Form  点击确定

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

4、此时Delphi为我们建立了一个窗口,这里就是我们要实现功能的地方,我在这个窗口里面添加了ado连接,adodataset,报表控件及一个按钮,窗口名称我命名为pgform

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

5、为我们的ActiveX插件添加属性及方法:点击ridl单元在ipgform,在这个ActiveX form的接口部分右击,弹出菜单,这里可以为这个插件添加新的接口,属性,及方法,数据模块等

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

6、注意右边的Type属性里面要选择BSTR(delphi里面的wideString),点击上面的刷新按钮,delphi会在unit1里面自动添加此属性的实现方法的框架

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里,我将这个新添加的属性命名为SQL,并在form 的private部分添加一个私有成员_sql用来保存这个属性值。同时用同样的方法,我添加一个方法ShowS,此时可以实现这个ShowS方法,完成一定的功能。这个属性和方法可以被Intraweb调用,后面再讲调用如何调用

7、在_TLB单元找到这个form的GUID(这个单元里面有很多GUID,记住是form的,不是其他的),这个GUID很重要,在下面的Intraweb里面调用ActiveX时需要用到。在本例当中就是最下面那个GUID,CLASS_pgform:TGUID=xxxxxxxxxxxxxxx

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

8、完成上面的属性和方法功能后,可以保存项目了,然后编译生成OCX文件


二、在Intraweb中调用ActiveX

1、新建Intraweb项目就不说了,在窗口中添加一个IWACtiveX控件,这个控件就是用来加载我们的ActiveX的

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里主要设置两个属性:一是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();

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这就是上面的IWACTIVEX控件的作用,用JavaScript语言插入一个ActiveX控件 ,剩下的事,他就做不了了。Delphi XE7 开发ActiveX 及在IntraWeb下调试 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

下面说说如何创建cab及签名

三、创建cab及签名

1、创建cab
用windows自带的iexpress创建cab包,在开始,运行中输入iexpress 出现下面窗口

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

选择Create new创建一个新的,点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

这里要选择最下面一个选项,创建一个自解压的ActiveX安装格式的cab,点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里,点击add按钮选择刚才我们编译好的ocx文件,点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里点击browse浏览文件夹,选择你想保存的位置及文件名,并把最下面一个复选框打钩,意思是保存长文件名

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这个窗口意思是,是否保存这个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是证书文件,当然文件名你可以自己指定

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

点击回车键后,会出现一个窗口要求输入密码,这个窗口要出现三次,请输入相同的密码

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

确定以后,证书就创建完毕了

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

3、用这个证书签名我们的cab控件包
在我们下载的SignTool工具包中有一个签名工具signcode.EXE,运行它

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

点击下一步选择我们刚才建立的cab控件包,我这里选择的是OCX,方法是一样的,下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里要选择自定,才可以在接下来的过程中选择我们刚才创建的cer证书文件

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

点击从文件选择,弹出窗口,选择我们刚才创建的cer证书文件并点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

这里要求选择密码文件,就是我们创建证书时候同时生成的那个pvk文件,点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

然后输入创建证书时候设定的密码,点击确定

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

随便选择一种加密算法,点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

直接点击下一步

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

一路点击下一步,要求输入密码的时候输入密码,完成

四、证书的安装
上面叙述了ActiveX开发,cab打包,证书创建,签名及在Intraweb中调用ActiveX,其实很简单。
是不是这样就一定可以了呢?不一定!由于我们的cab签名不是信任机构签发的(据说弄一个信任机构颁发的证书年费就要400美元Delphi XE7 开发ActiveX 及在IntraWeb下调试 ),所以还需要把签名cab控件包的cer证书安装到受信任的根证书区域,否则浏览器可能会阻止安装我们的ActiveX插件。
当浏览器阻止我们的插件时(客户端),会弹出一个窗口,上面有一个 “发布者”可以点击,然后可以查看这个插件签名的证书,点击查看证书,出现下面的窗口

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

点击安装证书,并选择第二个选项,指定位置安装

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

点击浏览按钮,出现选择证书的安装位置,此时要选择“受信任的根证书颁发机构”安装成功后,IE再次加载我们的ActiveX控件时,提示安装,点击安装即可。

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

五、OCX控件版本的控制

同一个CLASSID的ActiveX控件一旦注册到客户端机器中,每个支持OCX控件的浏览器都会自动加载。
但是如果我们的OCX控件功能升级了, 客户端使用的仍然是旧版本的OCX控件怎么办呢?总不至于在客户端电脑手动删除已注册的控件吧?解决的办法就是OCX的版本控制:同时改变OCX控件的文件版本和Intraweb中IWACTIVEX的CodeBase中的版本号可以达到此目的(这两个版本号一定要相同,否则客户端每次刷新页面,都要安装一次控件,挺烦人的哦) 

1、改变OCX控件的文件版本号
在上面的ActiveX开发例子中,编译成OCX之前,点击project-options打开对话框,找到Version页,可以看到文件的版本号设定,如下图所示
主版本号默认是1,后面默认是0,改变这个版本号。这里,我把主版本号改为4,编译生成OCX

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试

 

2、在Intraweb中改变CodeBase中的版本号

本例上面讲到的ActiveX调用中,CodeBase不带版本号,这里我们用下面所示的方法,加上版本号。#version=4,0意思是,让客户端浏览器在调用这个ocx时,检查已注册的ocx版本是否是4,0,如果是就调用,否则就重新下载安装。注意这里的4,0 中间是逗号,不是句号!
好了,重新编译这个dll,覆盖到网站根目录下,打开这个网页试试,浏览器会提示重新下载这个控件并安装。

 

Delphi XE7 开发ActiveX 及在IntraWeb下调试