C++Builder中开发Activex

简介: 1.创建自己的ActiveX控件 C++Buider开发ActiveX的功能非常强,但是这方面的资料却比较少,本人经过摸索终于搞定了创建Web方式Activex的基本方法 ⑴打开BCB6,新建一个Activex工程,选择时注意选择ActiveX标签页的Active Form ⑵在弹出...

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的,我们需要手动给它添加,假设id="myocx",然后添加一个js函数
  <script language="javascript">
     function testfun(){
       myocx.ShowValue(12345);
     }
  </script>
  然后在这个页面中添加一个按钮,在这个按钮的onclick事件中触发testfun函数,此处不再噜苏
  记得把这些文件拷贝到服务器上,不然会因为.inf文件找不到而导致activex不能正常显示
4.使用ActiveX Control Test Container进行测试
  ActiveX Control Test Container是个好东西,没有它,我还真不知道我编写的activex控件那里有问题呐
  这个工具随vc++一起安装,使用起来非常简单,打开之后选择edit->insert new control从控件列表中选择一个activex控件就可以了,这里当然是选择ActFrm罗
5.实现数字签名
  要是浏览器允许你任意下载activex控件的话,故事到这里也就结束了。可事实是,为了保证安全,浏览器是不会下载没有签名的控件的,如果控件没有签名,浏览器压根就不会给出任何提示,浏览器上面只有一把红叉
  ie有点残忍哈
  没关系,自己Diy一个签名就可以让浏览器给出下载提示框了。
  制作签名需要下面这些工具 makecert signcode cert2spc还有如果你需要自己打包ocx的话需要iexpress工具,这个工具在windows安装目录里面有
  前面三个工具可以从微软的官方站点获取
  手工编写一个bat文件(主要是不习惯一遍又一遍地敲命令),将这个bat文件放到f:\projscts\firstocx\published目录下
  makecert /sv "ActFrmProj1.PVK" /n "CN=公司名称,E=email,O=作者" ActFrmProj1.cer
  cert2spc ActFrmProj1.cer ActFrmProj1.spc
  signcode
  当然要用到这三条命令的话你必须将这三个文件的路径加入到windows环境变量path中去
  第一条命令产生ActFrmProj1.cer 和 ActFrmProj1.PVK 两个文件
  第二步将ActFrmProj1.cer 转为ActiveProj1.spc文件
  这个过程中会要求你输入密码,自己随便输一个,记不记得都没关系
  第三步就是给我们生成的cab文件前面,图形界面操作很容易
  ①选择BCB自动生成的cab文件,应该在f:\projscts\firstocx\published目录下
  ②签名类型选择自定义
  ③从文件选择一个证书,这里没有其它选择只有一个文件就是f:\projscts\firstocx\published下的spc文件
  ④私钥位置选择CSP中的私钥
  ⑤密钥容器选择ActFrmPrj1.pvk,这个文件就是第一步生成的那个pvk
  ⑥算法选择md5或者sha都可以,然后在其它证书中浏览,选择我们生成的ActFrmProj1.cer搞定了
  
  然后将puulished目录下的文件全部拷贝到myapp目录下,通过浏览器进行访问, 浏览器会弹出提示问是否要安装Activex控件,当然选是呐,不然岂不是白忙活了?

6.调试Activex的技巧
当我们使用BCB开发控件的时候会发现F9不能运行,原因就是ocx工作方式和dll文件类似,我们可以通过设置运行参数来解决这个问题,Run->Paramters在host appliaction 中选择ie,e.g:C:\Program Files\Internet Explorer\IEXPLORE.EXE
parameters输入如下:f:\projscts\firstocx\published\ActiveFrmProj.htm
再按F9就可以直接运行了

相关文章
|
2月前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
47 3
WK
|
15天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
37 1
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
64 7
WK
|
14天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
27 0
WK
|
15天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
17 0
|
30天前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
2月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
129 1
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
140 2
|
4月前
|
NoSQL API Redis
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址