1.创建自己的ActiveX控件
C++Buider开发ActiveX的功能非常强,但是这方面的资料却比较少,本人经过摸索终于搞定了创建Web方式Activex的基本方法
⑴打开BCB6,新建一个Activex工程,选择时注意选择ActiveX标签页的Active Form
⑵在弹出的对话框中设置ActiveX Name为 ActFrm,后面的实现单元和工程名都会自动更改
⑶勾选Make Control Licensed和Include Version Information,确定之后会出现一个和标准Form类似的
⑷在C++Builder自动创建的窗体上面添加一个按钮,随便实现一些功能,如ShowMessage("点击了按钮");
⑸设置Package相关参数。你肯定希望自己创建的ocx文件不依赖本机的开发环境,因此必须对编译器作适当的设置
ⅠProject->Option->Packages去掉Build With Runtime Packages 前面的勾
ⅡProject->Option->Linker 去掉动态RTL前面的勾,这样你产生的ocx文件就不会依赖BCB的开发环境了
好了做完上面的步骤,一个简单的Activex就创建完成了,可以选择Run菜单下的Register ActiveX Server进行注册,你就可以看到你的开发成果了,如果需要发布到互联网上,通过浏览器进行注册的话,那就需要做下面的设置
⑹设置Web Deployment Options
点击Web Deployment Options菜单,出现Web Deployment 选项设置窗口,有三个属性页
Ⅰ Project主要用于设置Activex文件的位置信息
①Target dir(Full path of the deployed OCX) 设置OCX目录,也就是在选择Project->WebDeploy之后ocx文件将要拷贝到的目录,我们可以在当前工程下建立一个punlished目录作为发布目录
e.g:当前工程目录为f:\projscts\firstocx 发布目录为f:\projscts\firstocx\published(也就是Target dir)
②Target URL( Virtual path of the deployed OCX)
如果客户端没有安装我们制作的activex控件,浏览器会自动到指定的网址进行寻找
e.g:本机IP192.168.0.228 端口 8080 虚拟目录 myapp(使用的Web服务器是Tomcat,myapp也就是D:\Tomcat\webapps下的目录)
此处输入http://192.168.0.228:8080/myapp/
③HTML dir(Full path of the deployed HTML file)
和Activex文件配套的html文件的存放位置,这里可以把它设置成f:\projscts\firstocx\published,主要是为了方便管理
在General Options下勾选一下四项
a.Use CAB file compression b.Deploy required packages
c.Include file version number d.Deploy additional files
ⅡPackages 这个页面用于发布控件中用到的额外的包,因为我们在第(5)步中已经去掉了额外的包,所以这一页为空
ⅢAdditonal Files,这一页用于发布其它文件,至于ocx文件有没有用到其它的文件我们可以使用vc++带的工具 Dependency Walker来进行查看,根据Dependency Walker的显示结果我们知道ocx使用到的dll文件在windows的目录下已经存在,没有必要随我们的ocx文件一起发布
但是由于我们制作控件的时候选择了Make Control Licensed,所以随包一起发布的应该还有一个lic文件,这个文件在工程目录下,我们在Additonal Files页中点击Add将lic文件包含进来就可以了
这个lic文件让我做控件走了不少弯路,开发出来的控件在本地可以运行良好(也就是在c++builder的run菜单里面使用register Activex server注册 ),但是一旦移到其它位置总是不能成功,而且最开始的时候也不知道使用vc++带的ActiveX Control Test Container工具来测试已经生成的ocx控件
恩,点击WebDeploy菜单就大功告成了么?没有。如果我们将published目录下的内容全部拷贝到tomcat的myapp目录下,然后将IE的安全等级调到最低,我们仍然无法浏览刚才生成的ActiveX控件,浏览器窗口上面始终显示一把红叉。真让人泄气
不过不要放弃,我们继续进行第2步
2.实现IObjectSafety
在IE6以及更高版本的浏览器中我们还必须实现IObjectSafety接口才能保证自己开发的ocx控件不会被IE禁用
怎么实现呢?其实很简单,加上几句话就可以了
①打开ActFrm的头文件,我们最开始的时候已经在这个Form上面加了一个按钮,打开它的头文件后可以看到一个类class TAcFrm 不要管它,跟它没有什么关系,接着往下看,可以看到类似
class ATL_NO_VTABLE TActFrmImpl:
VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........)之类的代码,我们在括号之后再给他加个接口
加完之后类似这样
class ATL_NO_VTABLE TActFrmImpl:
VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........),public IObjectSafetyImpl<TActFrmImpl,INTERFACESAFE_FOR_UNTRUSTED_CALLER>
注意不要丢了public前面的逗号,多重继承必须的
②然后再 void InitializeControl(){}函数结束之后加入
BEGIN_CATEGORY_MAP(TActFrmImpl)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()
③BEGIN_COM_MAP(TActFrmImpl)
VCL_CONTROL_COM_INTERFACE_ENTRIES(IActiveFrmX)
COM_INTERFACE_ENTRY(IObjectSafety)//加入这样一行就ok了
END_COM_MAP()
编译通过,应该没有问题
3.添加自定义的方法(接口)
我们做的ActiveX控件应该要能够与javascript之类的脚本进行交互,所以我们在控件中要实现自己的接口
选择菜单view->type library出现tlb文件的浏览窗口,这里面有一大堆的东西,都不要管它,我们直奔主题,找到IActFrm点击右键新建一个方法,就叫做ShowValue吧
在改方法的parameters页中给这个方法添加一个参数,参数名使用longvalue,参数类型使用variant,点击刷新按钮C++builder将自动给我们添加一个叫做ShowValue的方法,参数类型都设置好了,我们在这个函数里面添加ShowMessage(longvalue.iVal);
然后在ocx对应的htm文件中添加相应的js代码
默认生成的htm文件加载activex控件时是没有添加ID的,我们需要手动给它添加,假设>再按F9就可以直接运行了