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

Delphi XE7 开发ActiveX 及在IntraWeb下调试的更多相关文章

  1. delphi2010\delphi XE7 开发及调试WebService 实例

    使用delphi已经10多年了,一直搞桌面程序开发,对Webservice一直很陌生,近来因工作需要,学习delphi开发WebService,担心遗忘,作此笔记. 特别感谢 中塑在线技术总监 大犇  ...

  2. Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

    本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用JAVA的JAR,使用JA ...

  3. Delphi XE7下如何创建一个Android模拟器调试

    利用Delphi XE7我们可以进行多种设备程序的开发,尤其是移动开发应用程序得到不断地加强.在实际的Android移动程序开发中,如果我们直接用android真机直接调试是非常不错.一是速度快,二是 ...

  4. Delphi 开发ActiveX控件(非ActiveForm)

    Delphi 开发ActiveX控件(非ActiveForm) Q:为什么不采用ActiveForm工程?通过它可以快速开发带窗体控件,创建过程也非常简单(都不用考虑安全接口问题),很省事! A:如果 ...

  5. Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)

    http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者 ...

  6. Delphi XE7 GPS控件android下的新变化

    Delphi XE7 GPS控件的Android新变化 GPS控件的Accuracy可以起作用了,Accuracy>0时:      1--100:ACCURACY_HIGH  101--500 ...

  7. c#中开发ActiveX的学习笔记

    1.为什么要用ActiveX? 网页本身的功能是有限的,要想实现一些网页本身不支持的功能,比如:网页上的p2p视频播放,就得靠ActiveX这种古老的技术. 2.c#能开发ActiveX吗? 严格意义 ...

  8. c#中开发ActiveX的学习笔记【转】

    http://www.cnblogs.com/yjmyzz/archive/2009/12/14/1623396.html 1.为什么要用ActiveX? 网页本身的功能是有限的,要想实现一些网页本身 ...

  9. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

随机推荐

  1. js 数字添加逗号,格式化数字

    function addCommas(nStr) { nStr += ''; x = nStr.split('.'); x1 = x[0]; x2 = x.length > 1 ? '.' + ...

  2. 编写自己的C头文件

    1.       头文件用于声明而不是用于定义 当设计头文件时,记住定义和声明的区别是很重要的.定义只可以出现一次,而声明则可以出现多次. 下列语句是一些定义,所以不应该放在头文件里: extern ...

  3. 大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户

    大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户 主题:大龄剩女四大结局:孤寡 后妈 拉拉 出家

  4. Cgroup - Linux 内存资源管理

    Hi ,我是 Zorro .这是我的微博地址,我会不定期在这里更新文章,如果你有兴趣,可以来关注我呦. 另外,我的其他联系方式: Email: mini.jerry@gmail.com QQ: 300 ...

  5. @RestController

    /* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Vers ...

  6. [Angular 2] Mapping Streams to Values to Affect State

    While you have multiple streams flowing into your scan operator, you'll need to map each stream to t ...

  7. Android 自定义View (三) 圆环交替 等待效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107 一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很 ...

  8. JuiceSSh破解分析

    JuiceSSH是一款免费的远程ssh客户端,感觉是一款挺优秀的软件,里边有一些高级功能需要购买高级版才能使用,这里便对其对高级功能的破解进行分析. 本文仅用于学习交流使用,请尊重作者,勿在网上肆意发 ...

  9. LINUX更改时区和时间

    因为公司运营海外游戏,服务器也多数放在国外,有时候要求服务器时区和时间要与所服务的地区一致,这里就涉及到更改服务器时区和时间的问题: 下面以一台在美国的服务器为例,我们的IDC提供商是一家德国公司,服 ...

  10. HDU -2670 Girl Love Value

    这道题是刚好装满的背包问题,刚好选取k个,状态转移方程为dp[i][j] = max( dp[i - 1][j], dp[i - 1][j - 1] + Li - Bi(j - 1) ) dp[i][ ...