转载自:Qt 之 ActiveX控件跑官方例程记录

通过自己的实践,补充了一些技术细节

目录(?)[-]

  1. 开发环境
  2. 基础知识了解
  3. QT的ActiveX控件形式
  4. in-process运行的ActiveX server控件
  5. 独立运行的ActiveX server控件

开发环境

win7 64+QT5.8.0 + MSVC2015_32/64

基础知识了解

  1. ActiveX 是微软针对网页或其它应用调用而弄出来的,所以只能在IE中使用,firefox,chrome等不能用。所以,测试时请使用IE浏览器。
  2. 微软的东西,由于一些相应的API的兼容原因,无法用mingw版的编译器编译成功,编译出来的exe也不能正常运行。
  3. 由于ActiveX的安全阻截,所以如果你做的插件没有相应认证需要设置下IE,关于IE的安全设置如下看着勾吧 

  4. ActiveX控件与一般的共享库或程序一样,要检查其依赖是否完整,否则就要拷贝到一块。可以使用depends.exe查看,windeployqt.exe自动拷贝,在dll开发中有讲不多说了。

  5. 微软的IE中,HTML引入控件的方法(本来WEB开发小白,所以记录下。)

      <object ID="OBject" CLASSID="CLSID:控件的CLASSID号"CODEBASE="控件的cab文件">[错误提示信息]</object>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    • ID:实例化的对象名 (必须)
    • CLASSID :插件中实例化的类ID(必须)。
    • CODEBASE:如果本地注册表中没有注册该插件,则需要它提供一个地址来下载该插件的cab包(所以是非必须,只要你手动本地注册或手动运行了该插件服务就行。如何制作cab包另说【我的补充】如何打cab包)
    • 调用控件的方法,ID名就是对象名了,上面相当于实例化了一个控件中的类对象,可以直接调用其中的方法

      OBject.function(args);  
      • 1
      • 1

QT的ActiveX控件形式

QT的ActiveX控件有两种形式,一种是DLL,一种是EXE。两种形式的安装运行不同

  1. DLL的安装:

    • 使用微软提供的工具 regsvr32,成功后可以用regedit查询,可以直接写个bat在dll插件目录下,就可以不用写path路径了。
    regsvr32 path\xxx.dll  安装
    regsvr32 path\xxx.dll /u  卸载
    • 1
    • 2
    • 1
    • 2
    • 自己写个安装代码实现,跟调用dll一样(我的补充:win32 控制台程序即可,记得导入 <windows.h>)。
    HMODULE dll = LoadLibrary("myserver.dll");
    typedef HRESULT(__stdcall *DllRegisterServerProc)();
    DllRegisterServerProc DllRegisterServer =(DllRegisterServerProc)GetProcAddress(dll, "DllRegisterServer");HRESULT res = E_FAIL;
    if (DllRegisterServer)res = DllRegisterServer();
    if (res != S_OK)// error handling
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  2. EXE的安装运行 
    QT编译出来的exe运行有两种方式,一种是独立运行,一种是像dll那样类似先安装后调用。 
    具体看后面的例程说明—独立运行的ActiveX server控件


in-process运行的ActiveX server控件

此处以Hierarchy Example (ActiveQt) 为例说明(此例程宏定义中有多余的“;”,不删除也能编译通过,官方例程还出这种bug!!), 
在示例程序中搜索该项目,打开构建,成功后一般生成的主要文件是 .dll文件,此时看输出信息会显示“Server registered successfully!”说明IDC已经给我们注册到系统中了,不信可以打开注册表查看。 
此时如果执行网页,会发现什么也没有,控件没有被加载进来。 
这是因为dll它所依赖的其它dll也不全,在系统路径中找不到,所以加载不了。你手动注册下也不会成功,那为什么IDC能成功呢,因为IDC的环境变量中包含了QT库呀。命令行执行下面的语句,路径自己加,或者手动拷贝。dll齐全后再执行就OK了。

【我的补充】

windeployqt.exe xxx.dll
  • 1
  • 1

注意: 1.windeployqt的版本要选你编译时的KIT选择的版本。不然找的库也不对。比如64位下的windeployqt他只找64位的库,所以用depend.exe看没毛病可执行起来依然不行。这问题让我开始时完全找不到点上 
2.dll控件我用64位的msvc编译出来可注册,但执行不了,用32位就可以,无解。。。。。。。

独立运行的ActiveX server控件

此处以OpenGL Example (ActiveQt)为例说明, 
在示例程序中搜索该项目,打开构建,成功后一般生成主要文件是 .exe文件,可以单独运行(手动点击exe执行时,必须把依赖dll都拷贝在一起,直接点QT里的运行,它是自动加了QT库到PATH中的,所以看似不需要dll), 此时如果执行HTML代码

  <SCRIPT LANGUAGE="JavaScript">function setRot( form ){GLBox.setXRotation( form.XEdit.value );GLBox.setYRotation( form.YEdit.value );GLBox.setZRotation( form.ZEdit.value );}</SCRIPT><p />An OpenGL scene:<br /><object ID="GLBox" CLASSID="CLSID:5fd9c22e-ed45-43fa-ba13-1530bb6b03e0"CODEBASE="http://qt.nokia.com/demos/openglax.cab">[Object not available! Did you forget to build and register the server?]</object><br /><form>Rotate the scene:<br />X:<input type="edit" ID="XEdit" value="0" /><br />Y:<input type="edit" name="YEdit" value="0" /><br />Z:<input type="edit" name="ZEdit" value="0" /><br /><input type="button" value="Set" onClick="setRot(this.form)" /></form>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

会显示Object not available! Did you forget to build and register the server?,那是因为你还没有以activex服务的形式运行控件openglax.exe,那如何运行?

有两个方法:

  • 1 使用QT提供的小工具IDC注册下(第一次构建成功后你打开输出会有提示:“Server registered successfully!”,这就是用IDC注册成功了。)

    注:在非Qtcreator下运行时无论是想要注册成功还是以activex形式单独运行,都必须把依赖库找齐才行。所以这里虽然注册成功了,但运行网页依然不行。除非你弄齐了

  • 【我的补充】

  • 2 直接用命令行加参数运行插件,regsvr32是无法注册的。 
    看QT介绍.exe控件可以在其后添加命令参数。命令行可使用如下参数

    Option Result
    -regserver 注册控件服务到系统注册表中,可以在regedit查寻到,注册成功后可以在代码中指明CLSID就能调用了。 类似regsvr32 xx.dll
    -unregserver 从系统注册表中注销服务,注销后regedit自行删除相应项。regsvr32 xx.dll /u
    -activex 以ActiveX控件服务的形式启动该控件,这样即使不注册到系统注册表中,浏览器也可以调用该插件,就是启动速度慢。
    -dumpidl -version x.y Writes the server’s IDL to the specified file. The type library will have version x.y

为了方便验证,使用第二种简单,你可以先在Qtcreator项目配置中在command line arguments上加上 -activex,然后点击运行(F5)就OK了(注意要勾上add build library path to PATH,默认勾上的)。

【我的补充】

此时在打开测试网页看是不是成功了,可能控件区一片白,鼠标点击下就出来了,这种形式由于控件是单独运行的,所以每次打开页面之前都要运行下openglax.exe才能显示,不然不能加载插件。 
如果不想这么麻烦,那可以先用-regserver注册openglax.exe插件到系统注册表中,这样也就和dll形式的插件一样了,而且明显感觉到开启速度很快。如果Qtcreator运行注册成功了但依然不能显示,那是因为qt更改了path的原因,所以能注册,但运行网页时没有这个环境了,故你需要将依赖的dll和openglax.exe放到一块,不然无法正常加载。 
两种方式的网页测试都不强求测试网页要和插件放在一块,也不要求插件非要放在系统目录中,只是要求插件和所需依赖要一起且齐全。因为Qtcreator运行时是加了path变量的,重要的事情强调下。 
此种形式无论是32还是64的编译器都OK。 
演示如图: 

测试成功后再把依赖库打包一起发布吧。

Qt 之 ActiveX控件跑官方例程记录相关推荐

  1. VS+QT开发Ocx/ActiveX控件 一

    VS+QT开发Ocx/ActiveX控件 一 VS+QT开发Ocx/ActiveX控件-------网页中全屏 二 QT开发ActiveX控件 一:所用IDE版本,需用管理员权限 二:创建Active ...

  2. Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789693 长期持续带来更多项目与技术分 ...

  3. 注册ActiveX控件简单方法及控件未被正确授权解决方案

    最近编程的时候发现有些电脑上部分控件没有被注册,先把注册ActiveX控件的方法简单记录一下: 1.首先要确定你要缺少什么控件,需要注册: 2.在http://www.dll1.cn/ 下载相应的控件 ...

  4. Qt ActiveX控件为灰色

    背景: Qt 5.3.0 x64_opengl, 需要在Qt的窗口插入一个ActiveX控件,结果控件不可用,如下图所示. 原因: Qt的为64位版本, 而ActiveX控件为32位版本,这两者不兼容 ...

  5. 在bcb中添加activex控件_LinkedCell 属性介绍,OLEObjects 控件

    主要内容 OLEObjects控件里的LinkedCell属性应用示例 官方解释 返回或设置指向控制值的工作表区域. 如果为这些单元格赋值,则指定控制也会取得相应的值. 与此类似,如果更改控制的值,则 ...

  6. qt 背景和控件布局_Qt编写自定义控件26-平铺背景控件

    一.前言 平铺背景控件,主要的应用场景是作为画布出现,黑白相间的背景图,然后上面可以放置图片图形等,使得看起来更美观,比如PS软件新建图层以后的背景,FireWorks软件新建画布以后的透明背景,IC ...

  7. VB表格控件总览与例程分析

    一.表格控件总览: 在VB开发环境中,表格控件在界面开发元素中占有重要的地位.它不仅有外观整洁.表达形式规范的优点,而且更重要的是它较高的信息表现率(就是相对于其他控件来说能够表达更多的信息),随着信 ...

  8. VB6.0动态加载ActiveX控件漫谈[转]

    [转帖]VB6.0动态加载ActiveX控件漫谈http://www.7880.com/Info/Article-4b559560.html 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控 ...

  9. 如何检查电脑端安装的Flash Activex 控件版本?

    方法一:通过 控制面板 查阅 总共三大步,见下图所示: 方法二:在浏览器地址栏中,输入官方Flash版本检测网址 查看本地 不同的浏览器上 的 不同的Flash插件 版本: http://www.ad ...

最新文章

  1. 如何为ListView中的ImageView添加动画,谢谢!
  2. python课程思路_学习python课程第二十六天
  3. mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...
  4. CSS每日学习笔记(2)
  5. bash shell基础之二条件判断
  6. MySQL集群:高可用性DBMS
  7. (总结)Linux下多行合并成一行,中间加分隔符
  8. 再也不用花一天时间做ppt了
  9. imagej得到灰度图数据_imageJ 使用教程之样本长度测量
  10. GNSS精密轨道产品sp3与精密钟差产品clk批量下载(Linux Shell)
  11. Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化
  12. 2018年应届毕业宇视科技嵌入式软件开发工程师面试笔试总结
  13. 企业管理 史玉柱:公司只有三个人可以谈战略,其他人抓好执行
  14. JDBC,你真的知道怎么用吗?
  15. ORACLE OCP 考试指南
  16. asp.net小说网站案例
  17. 批量修改linux服务器密码,Linux下批量修改服务器用户密码方法步骤
  18. 零线和地线的区别,示波器如何测量市电?
  19. 车辆模型预测控制的概念介绍
  20. 领域知识图谱落地实践中的问题与对策

热门文章

  1. 购买计算机如何选择CPU,电脑CPU如何挑选 电脑小白选购CPU注意事项
  2. 店铺综合分中有关排序和等份的问题
  3. Lidar based off-road negative obstacle detection and analysis(论文翻译)
  4. Spring 编程式定时任务
  5. Chromium架构
  6. 男性英文名的意思 [2004-05-17 1:45 PM]
  7. 猿创征文|MySQL入门到实战-基础篇
  8. MySQL之concat的用法
  9. Ubuntu是现代(堂)吉诃德的痴想吗?
  10. 腾讯财付通漏洞遭黑客利用 威胁QQ彩钻等付费用户