zoukankan      html  css  js  c++  java
  • Delphi XE7 开发ActiveX 及在IntraWeb下调试

    最近学习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,覆盖到网站根目录下,打开这个网页试试,浏览器会提示重新下载这个控件并安装。

  • 相关阅读:
    Python在信号与系统(1)——Hilbert兑换,Hilbert在国家统计局的包络检测应用,FIR_LPF滤波器设计,格鲁吉亚也迫使高FM(PM)调制
    HDU 4925 Apple Tree
    [ACM] HDU 3395 Special Fish (最大重量二分图匹配,KM算法)
    OCP解决问题053-16 MEMORY_TARGET
    图像归一化
    我毕业10年
    静态分析与动态分析
    逐步求精
    抽象与逐步求精
    自项向下,逐步求精
  • 原文地址:https://www.cnblogs.com/mengmianren/p/5190266.html
Copyright © 2011-2022 走看看