Qt 之 ActiveX控件跑官方例程记录

网友投稿 786 2022-05-30

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

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

目录(?)[-]

开发环境

基础知识了解

QT的ActiveX控件形式

in-process运行的ActiveX server控件

独立运行的ActiveX server控件

开发环境

win7 64+QT5.8.0 + MSVC2015_32/64

基础知识了解

Qt 之 ActiveX控件跑官方例程记录

ActiveX 是微软针对网页或其它应用调用而弄出来的,所以只能在IE中使用,firefox,chrome等不能用。所以,测试时请使用IE浏览器。

微软的东西,由于一些相应的API的兼容原因,无法用mingw版的编译器编译成功,编译出来的exe也不能正常运行。

由于ActiveX的安全阻截,所以如果你做的插件没有相应认证需要设置下IE,关于IE的安全设置如下看着勾吧

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

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

CLASSID="CLSID:控件的CLASSID号"

CODEBASE="控件的cab文件">

[错误提示信息]

1

2

3

4

5

1

2

3

4

5

1

2

3

4

5

ID:实例化的对象名 (必须)

CLASSID :插件中实例化的类ID(必须)。

CODEBASE:如果本地注册表中没有注册该插件,则需要它提供一个地址来下载该插件的cab包(所以是非必须,只要你手动本地注册或手动运行了该插件服务就行。如何制作cab包另说【我的补充】如何打cab包)

调用控件的方法,ID名就是对象名了,上面相当于实例化了一个控件中的类对象,可以直接调用其中的方法

OBject.function(args);

1

1

1

QT的ActiveX控件形式

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

DLL的安装:

使用微软提供的工具 regsvr32,成功后可以用regedit查询,可以直接写个bat在dll插件目录下,就可以不用写path路径了。

regsvr32 path\xxx.dll 安装

regsvr32 path\xxx.dll /u 卸载

1

2

1

2

1

2

自己写个安装代码实现,跟调用dll一样(我的补充:win32 控制台程序即可,记得导入 )。

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

1

2

3

4

5

6

7

8

9

10

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

注意: 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代码

An OpenGL scene:

CODEBASE="http://qt.nokia.com/demos/openglax.cab">

[Object not available! Did you forget to build and register the server?]


Rotate the scene:

X:

Y:

Z:

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

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控件可以在其后添加命令参数。命令行可使用如下参数

为了方便验证,使用第二种简单,你可以先在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 Windows

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:#私藏项目实操分享# 提高区块链的可扩展性并不需要牺牲安全和去中心化
下一篇:【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )
相关文章