QT+VS Active组件开发

前言

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

创建Active组件

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

064453_HaQv_3127059.png

创建工程ActiveX
 
064509_cSgr_3127059.png

QAXFACTORY_DEFAULT宏

064553_yqtq_3127059.png

主要是导出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按钮,然后编译组件工程。编译完成后会注册到系统上。

064648_0zRV_3127059.png

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

064717_EafM_3127059.png

控件实现

064724_rSaC_3127059.png

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

064755_9Czo_3127059.png

可在QT Project Setting 中设置

064812_XupF_3127059.png

调用Active接口传参

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

064832_KwIW_3127059.png

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

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

064843_S5Qu_3127059.png

关于传递指针问题

定义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));

转载于:https://my.oschina.net/u/3127059/blog/1525902

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值