Qt中使用ActiveX(3篇)
由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持。本文主要记录个人学习ActiveX的一些内容,方便日后查阅。本文以Qt5(5.3.1)提供的ActiveX为参考,但是由于ActiveX这部分比较稳定,因此Qt4应该也是一样的。
- 概述
- 支持将已有的COM或者ActiveX空间引入到Qt的应用程序中
- 支持将Qt应用程序或者Qt的对象导出成COM对象或者ActiveX控件供他人使用
- 使用QAxContainer模块,通过QAxObject和QAxWidget分别支持COM对象和ActiveX控件的开发,可以通过这两个对象将外部的COM或者ActiveX组件接入到Qt应用程序
- 使用QAxServer模块,通过QAxAggregated、QAxBindable和QAxFactory类,通过了进程内和可执行程序exe两种方式的COM Server模式,用来将Qt写的内容导出为COM或者ActiveX供他人使用。

- 使用QtActiveX创建COM或ActiveX Server
- Qt作为Server支持的模式
- TEMPLATE = app
- QT += axserver
- RC_FILE = qaxserver.rc
当作为进程内dll的时候,需要这样写.pro文件
- TEMPLATE = lib
- QT += axserver
- CONFIG += dll
- DEF_FILE = qaxserver.def
- RC_FILE = qaxserver.rc
- ...
但是我们不用去操心这些内容,因为一般我们是用向导来生成Qt工程的,当你勾选ActiveX Server模式的时候,向导已经帮你写好这些内容了。
- TEMPLATE = lib
- VERSION = 2.5
- ...
- COM进程外和进程内使用方式的比较
- 开发Server的过程
- #include <QWidget>
- class MyActiveX : public QWidget
- {
- Q_OBJECT
只里面Q_OBJECT宏不能少,它提供了关于类MyActiveX的一些元数据信息, 接下来继续添加ActiveX的一些信息
- Q_CLASSINFO("ClassID", "{1D9928BD-4453-4bdd-903D-E525ED17FDE5}")
- Q_CLASSINFO("InterfaceID", "{99F6860E-2C5A-42ec-87F2-43396F4BE389}")
- Q_CLASSINFO("EventsID", "{0A3E9F27-E4F1-45bb-9E47-63099BCCD0E3}")
Q_CLASSINFO定义了COM组件的一些信息,这里面ClassID和InterfaceID是必须的,当你需要使用COM中的事件时,EventsID就需要添加进来。里面的128位的字符串使用GUID.exe工具生成(微软提供的一个小工具,可以生成全球唯一的标识符,可以在系统文件夹或者visual Studio的工具菜单中找到),工具提供了多种模式,可以选择需要的模式复制添加到代码中:

| 名称 | 值和含义 |
| Version | 类的版本号,默认值是1.0 |
| Description | 类的描述 |
| ClassID | 类的ID(COM中用来唯一确定一个类的方式) |
| InterfaceID | 接口ID(COM中用来唯一确定接口的方式) |
| EventsID | 事件ID |
| DefaultProperty | 默认属性 |
| DefaultSignal | 默认的时间 |
| LicenseKey | 类的许可号,默认未开启,如果开启使用类需要许可号 |
| StockEvents | TODO:??? |
| ToSuperClass | 暴露父类的接口 |
| Insertable | 设置"yes"后可以被列到OLE2容器中,默认未设置 |
| Aggregatable | 默认是"yes",COM支持聚合 |
| Creatable | 设置为“no”调用者不能使用该类 |
| RegisterObject | 仅能用在进程外方式的COM中 |
| MIME | 该COM控件支持的文件格式描述 |
| CoClassAlias | 类的名称在IDL中被修改为CoClassAlias指定的名字 |
继续上面的代码,接下来可以添加一些属性到COM组件中,可以使用另一个宏Q_PROPERTY
- Q_PROPERTY(int value READ value WRITE setValue)
之后可以像写Qt程序那样来完成。
- public:
- MyActiveX(QWidget *parent = 0)
- ...
- int value() const;
- public slots:
- void setValue(int v);
- ...
- signals:
- void valueChange(int v);
- ...
- };
Qt的ActiveX框架会将Qt类中的要素转换为COM中的标准要素供其他调用者使用,具体来说:
| Qt数据类型 | COM 属性数据类型 |
| bool | VARIANT_BOOL |
| QString | BSTR |
| int | int |
| uint | unsigned int |
| double | double |
| qlonglong | CY |
| qulonglong | CY |
| QColor | OLE_COLOR |
| QDate | DATE |
| QDateTime | DATE |
| QTime | DATE |
| QFont | IFontDisp* |
| QPixmap | IPixtureDisp* |
| QVariant | VARIANT |
| QVariantList | SAFEARRAY(VARIANT) |
| QStringList | SAFEARRAY(BSTR) |
| QByteArray | SAFEARRAY(BYTE) |
| QRect | User defined type |
| QSize | User defined type |
| QPoint | User defined type |
| Qt数据类型 | 对应COM的数据类型 |
| bool | [in] VARIANT_BOOL |
| bool& | [in,out] VARIANT_BOOL* |
| QString, const Qtring& | [in] BSTR |
| QString& | [in, out] BSTR* |
| QStinrg& | [in, out] BSTR* |
| int | [in] int |
| int& | [in, out]int |
| uint | [in,out]unsigned int |
| uint& | [int, out] unsigned int* |
| double | [in] double |
| QColor, const QColor& | [in] OLE_COLOR |
| QColor& | [in,out] OLE_COLOR* |
| QDate, const QDate& | [in] DATE |
| QDate& | [in,out]DATE* |
| QDateTime, const QDateTime& | [in] DATE |
| QDateTime& | [in,out]DATE* |
| QFont, const QFont& | [in] IFontDisp* |
| QFont& | [in,out]IFontDisp** |
| QPixmap, const QPixmap& | [in]IPictureDisp* |
| QPixmap& | [in,out]IPictureDisp** |
| QList<QVariant> | [in]SAFEARRAY(VARIANT) |
| QList<QVariant>& | [in,out]SAFEARRAY(VARIANT)* |
| QObject* | [in] IDispatch* |
- 发布COM控件
- QAXFACTORY_BEGIN("{ad90301a-849e-4e8b-9a91-0a6dc5f6461f}",
- "{a8f21901-7ff7-4f6a-b939-789620c03d83}")
- QAXCLASS(MyWidget)
- QAXCLASS(MyWidget2)
- QAXTYPE(MySubType)
- QAXFACTORY_END()
上面这段代码把MyWidget和MyWidget2导出为可供外部调用的COM对象,并注册MySubType类型可供MyWidget和MyWidget2中的属性和参数使用。
- 进程外COM控件的编写
- #include <QApplication>
- #include <QAxFactory>
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- if (!QAxFactory::isServer()) {
- // create and show main window
- }
- return app.exec();
- }
http://blog.csdn.net/csxiaoshui/article/category/5705027
http://download.csdn.net/detail/csxiaoshui/9728972
Qt中使用ActiveX(3篇)的更多相关文章
- 在Qt中使用ActiveX控件
Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件.ActiveQt包含了两个组件QA ...
- Qt中使用ActiveX控件
(转自:http://blog.csdn.net/tingsking18/article/details/5403038) 在Qt中使用ActiveX控件 Qt的windows商业版本提供了Activ ...
- Qt学习日记篇-Qt中使用Curl和jsonCpp
1.Qt中安装并使用jsonCPP库 1.1 官网下载.https://sourceforge.net/projects/jsoncpp/ 解压文件得到 jsoncpp-src-0.5.0 文 ...
- Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789693 长期持续带来更多项目与技术分享 ...
- 如何向VS2010中插入ActiveX控件并且附带相应的类
上两篇文章中我们已经讲述了ActiveX控件的一些相关知识,本文中,简单说明一下如何在我们自己的程序中使用ActiveX控件.(仍以我们上节课的例子为例) 我们打开VS2010编辑器,新建一个基于对话 ...
- 解析Qt中QThread使用方法
本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...
- Qt中使用QProcess备份和恢复Mysql数据库
分类: Qt2011-02-18 21:35 1395人阅读 评论(3) 收藏 举报 qtmysql数据库windowspathcmd . 使用Qt做MySQL数据库开发,遇到需要备份.还原数据库的问 ...
- 在QT中使用Irrlicht引擎的方法与步骤
Ø 相关库,插件安装部分 本篇文档介绍在Qt5.2.0下面使用lrrlicht引擎在Qt窗口中输出(开发环境:vs2012) 1. 首先安装好Qt5.2.0,下载地址: http://downlo ...
- Qt中调用PolarSSL库(一)
最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...
随机推荐
- java获取日期
/* * 获取昨天日期 方法一,这个方法好像有点慢 */Date dt = new Date(); Calendar cal = Calendar.getInstance();cal.add(Cale ...
- 转:JavaScript中的this陷阱的最全收集
在其他地方看到的,觉得解释的狠详细,特此分享 当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清 ...
- [深入浅出Windows 10]实现饼图控件
13.2 实现饼图控件 上一小节讲解了动态生成折线图和区域图,对于简单的图形这样通过C#代码来生成的方式是很方便的,但是当我们的图表要实现更加复杂的逻辑的时候,这种动态生成的方式就显得力不从心了,那就 ...
- [BZOJ2788][Poi2012]Festival
2788: [Poi2012]Festival Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 187 Solved: 91[Submit][Statu ...
- MathType的公式在word中跟文字不对齐
引用http://blog.sina.com.cn/s/blog_4d1f40c00100net8.html 部分Mathtype公式与文档文字没有很好的对齐,而是浮起来了,也就是说Mathtype公 ...
- Flex Flash Player回声消除的最佳方法
Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...
- 常见MVC框架比较
常见MVC框架比较 运行性能上: Jsp+servlet>struts1>spring mvc>struts2+freemarker>>struts2,ognl,值栈. ...
- 在VS2010中创建并引用dll(C#)
一般情况下,如果在新建或添加时选择“windows应用程序”或“控制台应用程序”时,结果都会被编译成exe,而选择“类库”时就会被编译成dll.也可以在项目属性中更改其输出类型,如下图: ...
- 使用Eclipse构建Maven项目 (step-by-step)
Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.本文仅对Eclipse中如何安装.配置和使用Maven进行了介绍.完全step by step. 如果觉得本文 ...
- 【腾讯云】腾讯云服务器搭建ftp服务器
一.硬件描述 1.1 云服务器:腾讯云 云主机 操作系统:Ubuntu Server 14.04.1 LTS 32位 CPU:1核 内存:1GB 系统盘:20GB(本地磁盘) 数据盘:0GB 公网带宽 ...