一、环境介绍
操作系统: 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同一个目录下面即可。