Delphi XE7 开发ActiveX 及在IntraWeb下调试

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

最近学习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下调试

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Delphi中的消息处理机制 delphi 方法
    每一个VCL都有一内在的消息处理机制,其基本点就是构件类接收到某些消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。    其中mainwndproc是定义在Twincontrol类中的一个静态方法,不能被重载(Override)。它不直接处
    02-09
  • Delphi XE6 通过JavaScript API调用百度地图
    Delphi XE6 通过JavaScript API调用百度地图
    参考昨天的内容,有朋友还是问如何调用百度地图,也是,谁让咱都在国内呢,没办法,你懂的。 首先去申请个Key,然后看一下百度JavaScript的第一个例子:http://developer.baidu.com/map/jsdemo.htm下一步,就是把例子中的代码,移动TWebBrower中。 unit Unit
    02-09
  • Delphi编译/链接过程 delphi编程案例
    Delphi编译/链接过程 delphi编程案例
    下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件。当Delphi编译项目(Project)时,将编译项目源文件、窗体单元和其他相关单元,在这个过程中将会发生好几件事情:首先,Object Pascal编译器把项目单元编译为二进制对象文件,然后
    02-09
  • Delphi CompilerVersion Constant / Compiler C
    http://delphi.wikia.com/wiki/CompilerVersion_Constant The CompilerVersion constant identifies the internal version number of the Delphi compiler.It is defined in the System unit and may be referenced either in code just as any other consta
    02-09
  • Delphi revelations #1 – kbmMW Smart client
    Delphi 启示 #1 – kbmMW Smart client on NextGen (Android) – 作用域问题以更高级的方式使用kbmMW smart client,在Android设备上,我遇到了问题。通过继承TInvokeableVariantType,kbmMW smart client可以使用Delphi支持的特殊类型的自定义Variant,从而可
    02-09
  • Delphi 调用DLL外部函数时的指针参数
    某项目需要调用设备厂家提供的DLL的函数,厂家给了一个VB的例子,有个参数是ByRef pBuffer As Single。于是在Delphi中用buffer:array of single代替:function func(buffer:array of single;count:integer):integer;far;stdcall;external 'func.dll';调用后bu
    02-09
  • 《zw版·Halcon-delphi系列原创教程》 Halcon分
    《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形为方便阅读,在不影响说明的前提下,笔者对函数进行了简化::: 用符号“**”,替换:“procedure”:: 用大写字母“X”,替换:“IHUntypedObjectX”:: 省略了字符:“const”、“OleVa
    02-09
  • 最简单的delphi启动画面(转)
    首先做一窗体,然后将BorderStyle的属性设为bsnone,放image控件,align设为alclient 然后将主程序的修改为 uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$ R *.res} begin Application.Initialize; Form2:=TForm2.Cre
    02-09
  • Delphi备忘三:TCollection的使用,用Stream保
     代码unit ufrmGetFunctionDefine;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,TypInfo,  Dialogs,ufrmStockBaseCalc, StdCtrls, ComCtrls,uQEFuncManager,uWnDataSet,uDataService;type  T
    02-09
  • Delphi Dcp 和BPL的解释
    dcp = delphi compiled package,是 package 编译时跟 bpl 一起产生出来的,记录着 package 中公开的 class、procedure、function、variable、const.... 等等的名称和相对位址。package英文翻译过来就是“包”。如果 某个控件包 A 引用了 控件包 B,当 控件包
    02-09
点击排行