一、环境介绍

操作系统: win10 64位 QT版本: 5.12.6 VS版本: 2017 使用QtActiveX进行封装COM组件,封装的COM组件有两种版本,一种是DLL 版本,另一种是封装成 EXE,由于com组件时微软的技术,编译的时候一定要使用MSVC编译器进行编译。

二、环境安装

​参考以下文章​


三、将Qt程序封装为COM组件

3.1.在 Qt Creator 中将exe注册为COM组件

在.pro文件中加入以上三行,第三行是版本信息可加可不加

class ffmpegVideoPlayer : public QWidget
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{4dc3f340-a6f7-44e4-a79b-3e9217695fbd}")
Q_CLASSINFO("InterfaceID", "{9ee49617-7d5c-441a-b833-4b068d40d751}")
Q_CLASSINFO("EventsID", "{13eca64b-ee2a-4f3c-aa04-5d9d975979a7}")
public:
ffmpegVideoPlayer(QWidget *parent = nullptr);
~ffmpegVideoPlayer();
...
}

最重要的就是三行 Q_CLASSINFO(),这个宏为类提供额外的信息,ClassID和InterfaceID必不可少,EventsID需要使用COM组件中的事件时就添加进来。宏的第二个参数是一个128为的字符串,是唯一的标识符

ClassID:类的ID(COM中用来唯一确定一个类的方式)注册成功后可以在注册表这个路径下找到此模块:

计算机\HKEY_CURRENT_USER\Software\Classes

InterfaceID:接口ID的标识

EventsID:事件ID标识符

还可以使用 Q_PROPERTY(int value READ value WRITE setValue) 添加一些其他的属性 提供获取COM对象的方法:

QAXFACTORY_BEGIN(
"{ce947ee3-0403-4fdc-895a-4fe779394b46}", // type library ID
"{8de435ce-8d2a-46ac-b3b3-cb800d0847c7}") // application ID
QAXCLASS(ffmpegVideoPlayer)
QAXFACTORY_END()

对于编译生成exe,需要在main函数中实例化一个QApplication

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (!QAxFactory::isServer()){
ffmpegVideoPlayer w;
w.show();
// create and show main window
}
return a.exec();
}

然后编译

出现Server registered successfully!表示注册COM组件成功。

3.2.在 VS2017中将dll库封装为COM组件 因为在Qt Creator 中将库封装为COM组件会出现问题,暂时还没有解决所以直接在VS2017中创建Qt ActivQt Server 项目再将其他源文件移植过来编译即可。主要解决的是移植的问题,在编译完成的时候会自动注册,最后会出现Server registered successfully!,此时可以在注册表中找到该项。

四、注册编译好的COM库。

进行打包

注册exe程序 出现Server registered successfully!字样表示注册成功

注册dll :

五、使用html调用COM组件

调用exe

<html>
<head>
<title>ffmpegVideoPlayer</title>
</head>
<body>
<object id="ffmpegVideoPlayer" width="80%" height="80%"
classid="clsid:4dc3f340-a6f7-44e4-a79b-3e9217695fbd">
</object>
</body>
</html>

使用IE浏览器打开后运行上面生成的exe程序,刷新浏览器

点击确定

在这里插入图片描述

运行正常 调用dll的时候HTML代码只要改成相应的classid,然后将html文件放在dll同一个目录下面即可。