最近学习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. 关于pthread里面一些函数的使用心得!

    第一次使用pthread,遇到的问题还真不少,现在我一一记录一下: 1.关于编译时出现 对‘pthread_create’未定义的引用 之类的错误的解决:由于pthread库不是Linux系统默认的库 ...

  2. HDU4666 Hyperspace(曼哈顿)

    题目链接. 分析: 这是多校的一个题,当时没做出来.学长说让用multiset. 用multiset将每一个数的1<<dim个状态全部保存.假设状态 i, 最远曼哈顿距离应当是 max[i ...

  3. COJ 0581 4022农夫喂牛

    4022农夫喂牛 难度级别:D: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 农夫老张养了N头牛,编号分别从1到N.现在,它们要“用餐”,按 ...

  4. ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。

    官方文档:https://msdn.microsoft.com/zh-cn/library/system.obsoleteattribute(v=vs.110).aspx 备注 ObsoleteAtt ...

  5. 反编译工具 使用.NET JustDecompile来反编译你的程序代码

    原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...

  6. mac下离线博客编辑器 marsedit 3.6.8 注册码

    参见博客:http://maoshu.cc/967.html 我这里保存了一份在自己的百度网盘,地址就不分享了. 主要是这个注册码要记一下: Name: The Blade SN:   RSME3-D ...

  7. java排序算法-选择排序

    public class SelectionSort { private static void selectSortTest() { int[] sortArray = { 5, 2, 4, 1, ...

  8. 判断客户端浏览器是否安装了Flash插件

    <script> /*检测浏览器是否安装了插件(在IE 中无效)*/ function hasPlugin(name){ name = name.toLowerCase(); for(va ...

  9. 数据库 —— mySQL 的安装

    [转载Link]MySQL-5.6.24免安装版配置方法,有需要的朋友可以参考下. 1. 下载MySQL Community Server 5.6.24 2. 解压MySQL压缩包 将以下载的MySQ ...

  10. javascript 数组 排除null, undefined, 和不存在的元素

    The most common way to loop through the elements of an array is with a for loop: var o = [1,2,3,4,5] ...