文档章节

QT+VS Active组件开发

赫拉蒂姆
 赫拉蒂姆
发布于 2017/08/30 08:41
字数 779
阅读 40
收藏 0

前言

  项目开发使用QT + VS, 在过程中用到了Active组件,平常接触少,所以花了一些时间研究了一下,过程中也遇到不少坑,做篇文章作为记录参考。

创建Active组件

  QT提供两种库导出形式,一种是DLL动态库,一种就是Active组件(active是一个microsoft的术语,它指的是一组包括控件、dll、active文档的组件,通常以动态链接库的形式存在。),值得注意的是QT的库是可以带UI图形界面的,这和纯C++不同,但使用时候加载配置方式相似。创建Actvie工程,选择Qt ActiveQT Server。(以下需要配置QT + VS开发环境)

创建工程ActiveX
 

QAXFACTORY_DEFAULT宏

主要是导出COM组件的ID,依据官方说明,参数含义如下

QAXFACTORY_DEFAULT(ActiveX,       // QWiget class,

         "{2c13fb28-1776-405a-9eea-8b68a0a43a25}", // class ID

         "{f73f1784-c32f-4759-a029-a47ea3a3016a}",  //interface ID

         "{f6b779b9-d25e-43f2-a9ab-bf542fd49645}",  // event interface ID

         "{391d4c67-17e0-4a3f-81b6-7f02e0fe5f2d}",   // type library ID

         "{82ac53a9-7842-4fc4-891f-042a8d324bbb}"   // application ID

)

较为关键是Class ID,加载COM组件主要通过这个ID进行标识。

调用

在ActiveQT组件中,通过QT Designer添加一个QButton按钮,然后编译组件工程。编译完成后会注册到系统上。

创建QAxWidget对象,通过ClassID加载控件。

控件实现

需要注意如果包含#include< QAxWidget> 编译不通过,需要加载包含QT lib库Qt5AxContainer.lib如下图:

可在QT Project Setting 中设置

调用Active接口传参

  Active组件调用方式通过动态加载,调用方式一般使用dynamicCall, 传递参数使用QList<QVariant>参数列表,如下图:

 返回值可以通过dynamicCall返回值获取,另一种方法就是通过参数了列表QString strRetVal = input.at(2).toString();

需要注意声明函数要使用public slots 否则会出现: dynamicCallHelper:XXXX: No such property in错误。

关于传递指针问题

定义ActiveQT提供的接口,参数不要使用非QT标准类型,使用QVariant中定义的类型,对于必须要传递指针的情况可以使用QByteArray

传递字符指针

传递字符指针可以使用如果只是QT类型可以使用QString,如果有需求需要使用非QT对象,为了灵活可以使用QByteArray,传参数的时候可以使用标准std::string。

组件接口实现

void ActiveX::OnAdd(QByteArray ba)

{

         QString str(ba);

         qDebug() << str;

}

调用

QtGuiApplication1::QtGuiApplication1(QWidget *parent)

         : QMainWindow(parent)

{

     .......

     ………

 

         std::string str = "TestString";

         QVariant param(str.data());

         QList<QVariant> inplist;

         inplist << param;

         qw->dynamicCall("OnAdd(QByteArray ba)", inplist);

}

传递结构体指针

传递结构体指针相对比较麻烦。

结构体定义:

typedef struct

{

         int age;

         char name[20];

}Student;

组件接口实现

void ActiveQtServer1::OnAdd(QByteArray ba)

{

         Student * student = (Student *)ba.data();

         qDebug() << student ->age << "---" << student ->name;

}

调用

QtGuiApplication1::QtGuiApplication1(QWidget *parent)

         : QMainWindow(parent)

{

     .......

     ………

Student student;  // 定义结构体

student.age = 100;

student.Name = AFK;

 

QByteArray ba;

ba.resize(sizeof(Person));

std::memcpy(ba.data(), &persion, sizeof(Person));  //赋值

 

QVariant param(ba);

         QList<QVariant> inplist;

         inplist << param;

         qw->dynamicCall("OnAdd(QByteArray ba)", inplist);

}

同时也可以传递数组

persionNum[2];

std::memcpy(ba.data(), & persionNum, sizeof(persionNum));

© 著作权归作者所有

共有 人打赏支持
赫拉蒂姆
粉丝 0
博文 7
码字总数 6300
作品 0
齐齐哈尔
React 组件开发入门

前言 熟悉 React 的思想后,我们先来尝试开发一个单纯的小组件,可以对比一下是不是比以前的开发模式更加舒适了,这里我主要以一个 Loadding 组件来举栗子,实现了几个基本的功能: 一种类型...

卢林
2016/09/22
863
1
Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)

Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序) 目录(?)[+] 一基础知识介绍 二 ActiveForm工程 一、基础知识介绍: 1、ActiveForm的基础知识介绍: 在Delphi中,Act...

vga
2014/03/06
0
0
vue-router(2.0)入门教程

概述: vue-router是Vue.js官方的路由插件,比较适合用于构建单页面应用....(此处就省略了,直接主题)。本教程主要针对对api还比较不熟的同学,所以demo都是简单(js + html混写的)。目标:...

gujieyi
2016/10/15
4.7K
2
WTL

Windows 模板库 (WTL) 是一个用来开发 Windows 应用程序的 C++ 的 UI 组件,它扩展了 ATL (Active Template Library) 提供了一系列的对话框、帧、GDI对象等等。...

匿名
2008/12/04
13.4K
3
Exchange 2013 ServerComponent状态异常处理

Exchange 2013 ServerComponent状态异常处理 今天客户说内部的打印机发邮件发不出去了,打印机邮件设置是指向CAS的负载均衡地址(两台CAS做的NLB),测试直接指向物理地址,结果一台可以,一...

ultradream
2014/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
59分钟前
1
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
今天
2
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
今天
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
3
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部