如何使用QT开发activex控件开发教程

使用C#开发ActiveX控件
IT168网站原创
 作者: ITPUB论坛 编辑:
  完成控件开发后,为了使该用户控件作为一个ActiveX控件进行使用,还需要做以下修改:  首先,为控件类添加GUID,这个编号将用于B/S系统的客户端调用时使用(可以使用 工具-创建GUID 菜单创建一个GUID):  Guid(&<span style="color: #A44CF4E-F859-4328-AA22-3E9D7AFFF1AB&)]  public partial class Hello : UserControl&  其次,为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为&IObjectSafety&的接口。先创建该接口(注意,不能修改该接口的GUID值):  using S  using System.Collections.G  using System.T  using System.Runtime.InteropS  namespace Preresearch.CSharpActiveX  {  [ComImport, GuidAttribute(&CB5BDC81-93C1-11CF-8F20-4&)]  [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]  public interface IObjectSafety  {  [PreserveSig]  int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);  [PreserveSig()]  int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);  }  }  然后在控件类中继承并实现该接口:  #region IObjectSafety 成员  private const string _IID_IDispatch = &{0-}&;  private const string _IID_IDispatchEx = &{a6efd0-c90dcaa9}&;  private const string _IID_IPersistStorage = &{00-}&;  private const string _IID_IPersistStream = &{0-}&;  private const string _IID_IPersistPropertyBag = &{37D84F60-42CB-11CE-4BB851}&;  private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = <span style="color: #x;  private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = <span style="color: #x;  private const int S_OK = <span style="color: #;  private const int E_FAIL = unchecked((int)<span style="color: #x);  private const int E_NOINTERFACE = unchecked((int)<span style="color: #x);  private bool _fSafeForScripting = true;  private bool _fSafeForInitializing = true;  public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)  {  int Rslt = E_FAIL;  string strGUID = riid.ToString(&B&);  pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;  switch (strGUID)  {  case _IID_IDispatch:  case _IID_IDispatchEx:  Rslt = S_OK;  pdwEnabledOptions = <span style="color: #;  if (_fSafeForScripting == true)  pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;  break;  case _IID_IPersistStorage:  case _IID_IPersistStream:  case _IID_IPersistPropertyBag:  Rslt = S_OK;  pdwEnabledOptions = <span style="color: #;  if (_fSafeForInitializing == true)  pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;  break;  default:  Rslt = E_NOINTERFACE;  break;  }  return R  }  public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)  {  int Rslt = E_FAIL;  string strGUID = riid.ToString(&B&);  switch (strGUID)  {  case _IID_IDispatch:  case _IID_IDispatchEx:  if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))  Rslt = S_OK;  break;  case _IID_IPersistStorage:  case _IID_IPersistStream:  case _IID_IPersistPropertyBag:  if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))  Rslt = S_OK;  break;  default:  Rslt = E_NOINTERFACE;  break;  }  return R  }  #endregion  这样,一个ActiveX控件就开发完成了。  ActiveX控件部署 ActiveX控件可以使用Visual Studio 2005的安装项目进行部署。这与普通的Windows Form应用程序的部署几乎一样,只有一个地方需要注意,将前面创建的用户控件项目作为主输出项目,并设置其Register属性为vsdrpCOM,如下图所示:  测试 建立一个Web应用程序项目,在测试页面的HTML代码中添加对ActiveX控件的引用,并且可以通过Javascript调用控件的公共成员(注意这里clsid后面的值即为前面为用户控件类设置的GUID):    将该Web应用程序项目发布到IIS。另外找一台电脑作为客户端测试环境,确保它与服务器端网络连通,安装.NET Framework 2.0和该ActiveX控件。安装完成后,就可以用浏览器访问服务器,进行测试了(你也可以在开发环境的系统中安装该ActiveX控件,并直接在VS 2005中运行WebApp项目查看结果):  总结  综上所述,在Visual Studio 2005环境中使用C#开发ActiveX控件,技术实现上没有什么难度,唯一的问题就是客户端需要安装.NET Framework。鉴于ActiveX控件一般都是实现一些简单单一的功能,.NET Framework 2.0已经完全可以应付,所以建议在.NET Framework 2.0下开发。因为相对于.NET Framework 3.5两百多兆的安装包,.NET Framework 2.0安装包只有20多兆,用户相对容易接受一些。
大学生分期购物销量榜
已有条评论
IT168企业级
正在努力加载文档,请稍等…二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1473)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Qt 开发ActiveX控件常见问题',
blogAbstract:'Typical Errors During the Post-Build StepsFor the&'
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}开发ActiveX控件的实践(1)--用VS2010开发一个简单的TestOcx控件
&&& 点选VS2010
IDE 的 文件-&新建-&项目,在新建项目窗口中选择 MFC
ActiveX 项目,输入项目名称 TestOcx:
点击确定,以后的设置选择默认,一路选择下一步直到完成,VS2010就自动生成了一个基本的控件,功能是画一个椭圆:
&&& 在资源视图中右击
Dialog,在弹出的菜单中选 插入Dialog,为项目添加一个对话框。在右边的属性页中将ID项的值改为 IDD_D1,
Visible项的值改为 True,Style项的值改为
Child。右击对话框,在弹出的菜单中选择添加类,输入类名CMainDialog 。
&&& 在类视图中右击
CTestOcxCtrl 类,在弹出的菜单中选择添加变量,输入变量类型
CMainDialog,变量名为m_Dialog。在CTestOcxCtrl 类的属性页中点击 消息 按钮,选择 WM_CREATE
消息,打开右边的下拉框,双击 OnCreate 添加该函数。
在OnCreate 函数中添加如下代码:
m_Dialog.Create(IDD_D1,this);
在CTestOcxCtrl 类的 OnDraw函数中注释掉 VS2010 自动生成的画一个椭圆的代码:
//pdc-&FillRect(rcBounds,
CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc-&Ellipse(rcBounds);
编译通过后,就这么简单,一个ActiveX控件就生成了,在Debug目录中将有一个 TestOcx.ocx
控件文件且该控件已自动注册到了本机的注册表中。
TestOcx.idl 文件,在文件最后的类信息中找到 classid
的值,自己编写一个.htm文件,将classid值放置到相应的位置上,运行这个.htm文件后,在打开的网页中就出现了一个对话框:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在Qt中使用ActiveX控件
Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件。ActiveQt包含了两个组件QAxContainer和QAxServer。
QAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去。
QAxServer可以将我们写的Qt控件导出为COM对象或者是ActiveX控件。
第一个例子我们来演示一下在Qt中使用shockwaveFlash这个ActiveX控件。
#include &QApplication&
#include &QtGui&
#include &QAxWidget&
int main(int argc, char *argv[])
QApplication a(argc, argv);
QAxWidget *flash = new QAxWidget(0,0);
flash-&resize(500,80);
flash-&setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-}"));
flash-&dynamicCall("LoadMovie(long,string)",0,"c:/1.swf");
flash-&show();
return a.exec();
QAxContainer不包含在QtCore里面,所以要使用QAxContainer的话还必须要在.pro文件中添加 CONFIG+=qaxcontainer
下面就来解释一下上面的代码:
首先我们创建了一个QAxWidget对象。QAxWidget对象是用来封装ShockwaveFlash这个ActiveX控件。QAxContainer是有三个类组成的。分别是:QAxObject封装了COM对象、QAxWidget封装了ActiveX控件、QAxBase是QAxObject和QAxWidget的父类,它实现了封装COM的核心函数。
这三个类的关系如下:
然后通过setControl设置ShockwaveFlash这个ActiveX控件的class_id,class ID可以通过一些其它的编程工具获得(vc/Delphi/Microsoft ActiveX Control Pad)。这时就会调用CoCreateInstance创建ActiveX控件的实例。这时这个ActiveX控件的所有的属性、方法、事件将通过QAxWidget转换为Qt的properties、signals和slots。
通过调用QAxWidget的property()方法和SetProperty方法可以获取和设置ActiveX控件的属性。
既然可以调用ActiveX控件的方法属性,当然也就需要有COM中的数据类型和Qt中的使用的数据类型的转换了。下面就是COM中数据类型和Qt中的数据类型对应的表格:
通过dynamicCall方法来调用ActiveX控件的方法。
1)dynamicCall()最多传递八个QVariant类型的参数,并且返回类型也是QVariant。
2)如果我们需要传递IDispatch *或者是IUnknown *,我们可以将这些组件封装成QAxObject,然后通过调用asVariant()方法来将这个COM对象转换为QVariant。同样如果我们返回一个IDispatch*或者IUnknown*的对象,就需要通过querySubObject方法将这个对象转换为QAxObject。
QAxObject *session = outlook.querySubObject("Session");
3)如果不想这样做还可以QAxWidget还为我们提供了QueryInterface方法 IWebBrowser2 *webBrowser = 0;
activeX-&queryInterface(IID_IWebBrowser2, (void *)&webBrowser);
if (webBrowser) {
webBrowser-&Navigate2(pvarURL);
webBrowser-&Release();
4)dynamicCall方法还可以设置COM控件的属性:
activeX-&dynamicCall("Value", 5);
QString text = activeX-&dynamicCall("Text").toString();
5)通过dynamicCall调用COM对象的方法的时候需要提供完成的函数签名。
activeX-&dynamicCall("Navigate(const QString&)", "");
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
在Qt中使用ActiveX控件&Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件。ActiveQt包含了两个组件QAxContainer和QAxServer。&l&&&&&&&& QAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去。&l&&&&&&&& QAxServer可以将我们写的Qt控件导出为COM对象或者是ActiveX控件。&第一个例子我们来演示一下在Qt中使用shockwaveFlash这个ActiveX控件。&#include &QApplication&#include &QtGui&#include &QAxWidget&int main(int argc, char *argv[]){&&&&QApplication a(argc, argv);&&&&QAxWidget *flash = new QAxWidget(0,0);&&&&flash-&resize(500,80);&&&&flash-&setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-}"));&&&&flash-&dynamicCall("LoadMovie(long,string)",0,"c:/1.swf");&&&&flash-&show();&&&&return a.exec();}&QAxContainer不包含在QtCore里面,所以要使用QAxContainer的话还必须要在.pro文件中添加 CONFIG+=qaxcontainer&下面就来解释一下上面的代码:&1.&&&&&& 首先我们创建了一个QAxWidget对象。QAxWidget对象是用来封装ShockwaveFlash这个ActiveX控件。QAxContainer是有三个类组成的。分别是:QAxObject封装了COM对象、QAxWidget封装了ActiveX控件、QAxBase是QAxObject和QAxWidget的父类,它实现了封装COM的核心函数。&这三个类的关系如下:&2.&&&&&& 然后通过setControl设置ShockwaveFlash这个ActiveX控件的class_id,class ID可以通过一些其它的编程工具获得(vc/Delphi/Microsoft ActiveX Control Pad)。这时就会调用CoCreateInstance创建ActiveX控件的实例。这时这个ActiveX控件的所有的属性、方法、事件将通过QAxWidget转换为Qt的properties、signals和slots。&通过调用QAxWidget的property()方法和SetProperty方法可以获取和设置ActiveX控件的属性。&既然可以调用ActiveX控件的方法属性,当然也就需要有COM中的数据类型和Qt中的使用的数据类型的转换了。下面就是COM中数据类型和Qt中的数据类型对应的表格:&3.&&&&&& 通过dynamicCall方法来调用ActiveX控件的方法。&1)dynamicCall()最多传递八个QVariant类型的参数,并且返回类型也是QVariant。&2)如果我们需要传递IDispatch *或者是IUnknown *,我们可以将这些组件封装成QAxObject,然后通过调用asVariant()方法来将这个COM对象转换为QVariant。同样如果我们返回一个IDispatch*或者IUnknown*的对象,就需要通过querySubObject方法将这个对象转换为QAxObject。&&&&&&&& QAxObject *session = outlook.querySubObject("Session");&& 3)如果不想这样做还可以QAxWidget还为我们提供了QueryInterface方法 IWebBrowser2 *webBrowser = 0;&&activeX-&queryInterface(IID_IWebBrowser2, (void *)&webBrowser);&&if (webBrowser) {&&&&&&webBrowser-&Navigate2(pvarURL);&&&&&&webBrowser-&Release();&&}&&&&&&&&4)dynamicCall方法还可以设置COM控件的属性:&&&&&&&& activeX-&dynamicCall("Value", 5);&&&&&&&& QString text = activeX-&dynamicCall("Text").toString(); 5)通过dynamicCall调用COM对象的方法的时候需要提供完成的函数签名。&activeX-&dynamicCall("Navigate(const QString&)", "");
只回答业务咨询
王牌软件,兼职软件设计,软件修改,毕业设计。
本文出自 王牌软件,转载时请注明出处及相应链接。本文永久链接: /?p=557
业务咨询站长
<img src="/v1/create-qr-code/?size=100x100&data=" alt="QR:
&#404;回顶部1216人阅读
Qt ActiveX技术(2)
由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持。本文主要记录个人学习ActiveX的一些内容,方便日后查阅。本文以Qt5(5.3.1)提供的ActiveX为参考,但是由于ActiveX这部分比较稳定,因此Qt4应该也是一样的。
Qt提供了QtActiveX模块来支持微软ActiveX的开发,Qt的ActiveX和COM的开发支持两种方式:
支持将已有的COM或者ActiveX空间引入到Qt的应用程序中支持将Qt应用程序或者Qt的对象导出成COM对象或者ActiveX控件供他人使用
具体来说,Qt是通过ActiveXQt框架中的两个模块来支持上述所说的两种方式的:
使用QAxContainer模块,通过QAxObject和QAxWidget分别支持COM对象和ActiveX控件的开发,可以通过这两个对象将外部的COM或者ActiveX组件接入到Qt应用程序使用QAxServer模块,通过QAxAggregated、QAxBindable和QAxFactory类,通过了进程内和可执行程序exe两种方式的COM Server模式,用来将Qt写的内容导出为COM或者ActiveX供他人使用。
下图简要的说明了QtActiveX的作用
使用QtActiveX创建COM或ActiveX Server
在正式开始之前先对COM和ActiveX做一个简要的对比。COM(Component Object Model)是微软提出的一种技术,它定义了一种规范,通过COM可以轻松实现一种语言(如C#)调用另一种语言(如C&#43;&#43;、VB等)开发的功能模块。ActiveX是微软主要针对互联网客户端设计的以COM为技术基础的一种实现,一般来说二者并没有本质的区别,仅有一些概念上的差异,一般来说:
1. ActiveX一般包含一个窗体界面,COM对象一般并没有界面
2. COM对象一般作为一个可调用的模块来使用,ActiveX一般嵌入在网页中使用
上述仅仅是一种使用上的惯例,但是并未强制一定这样
使用Qt作COM和ActiveX的开发需要使用QAxServer模块,这里面包含三个类:
1. QAxFactory定义了创建COM对象的工厂类
2. QAxBindable定义了COM对象与Qt对象之间的转换关系,也就是说Qt中的对象通过QAxBindable转换为COM中的要素
3. QAxAggregated定义了COM组件接口
Qt作为Server支持的模式
COM组件在开发出来之后有多种形式,可以是一个dll,也可以是一个exe可执行程序。可以在进程中被加载(一般最常用的模式),可以作为外部进程为其他进程提供服务,甚至可以是远程服务器上的进程为本地集成提供服务。Qt ActiveX 提供了In-Process和out-of-process executable两种方式的支持。简单来说就是提供了一种 Dll供应用程序调用也提供了一种可以作为运行的exe,为其他应用提供一些调用服务。
当作为独立exe时候,我们需要这样编写.pro文件:
TEMPLATE = app
+= axserver
= qaxserver.rc当作为进程内dll的时候,需要这样写.pro文件
TEMPLATE = lib
QT += axserver
DEF_FILE = qaxserver.def
= qaxserver.rc
...但是我们不用去操心这些内容,因为一般我们是用向导来生成Qt工程的,当你勾选ActiveX Server模式的时候,向导已经帮你写好这些内容了。
当使用QAxServer开发dll时,实际工程编译链接过程中会涉及到以下的过程:
1. 应用程序将会链接到qtserver.lib而不是qtmain.lib
2. idc工具会被调用,产生IDL文件(接口描述语言的接口描述文件)
3.调用MIDL工具编译IDL文件到类型库
4.调用idc工具将类型库附到server的二进制代码中
5. 注册dll
另外在.Pro文件中可以添加一个版本信息,这个版本信息会作类型库和server dll的版本号,添加方式使用VERSION变量即可:
TEMPLATE = lib
VERSION = 2.5
COM进程外和进程内使用方式的比较
进程外的使用方式是将COM写成一个exe可执行文件,当它运行的时候其他程序可以调用它提供的接口来开发,这样做如果某个调用它的程序出了bug,那么只有该程序会崩溃,其他调用不收影响,提供了更好的隔离性。缺点是需要更长的启动时间与跨进程通信的一些额外负担。
进程内的使用方式就很简单了,调用过程仅仅是通过类&#20284;虚函数这样的调用,需要加载的时间短、效率比较高。
开发Server的过程
为了使用Qt实现COM对象,我们必须使用一个QObject的子类,如果该子类是QWidget的子类,那么这个COM对象就是一个ActiveX控件。代码如下:
#include &QWidget&
class MyActiveX : public QWidget
Q_OBJECT只里面Q_OBJECT宏不能少,它提供了关于类MyActiveX的一些元数据信息, 接下来继续添加ActiveX的一些信息
Q_CLASSINFO(&ClassID&, &{1D9928BD-4453-4bdd-903D-E525ED17FDE5}&)
Q_CLASSINFO(&InterfaceID&, &{99FA-42ec-87F2-9}&)
Q_CLASSINFO(&EventsID&, &{0A3E9F27-E4F1-45bb-9E47-63099BCCD0E3}&)Q_CLASSINFO定义了COM组件的一些信息,这里面ClassID和InterfaceID是必须的,当你需要使用COM中的事件时,EventsID就需要添加进来。里面的128位的字符串使用GUID.exe工具生成(微软提供的一个小工具,可以生成全球唯一的标识符,可以在系统文件夹或者visual Studio的工具菜单中找到),工具提供了多种模式,可以选择需要的模式复制添加到代码中:
除了上述基本必要的信息之外(ClassID实际上被写入注册表中,当控件被使用的时候会搜索注册表找到里面该COM控件dll的位置并加载,可以使用regedit.exe在HKEY_CLASSES_ROOT中找到很多已经注册的COM组件信息),Qt还提供了Q_CLASSINFO更多的内容,如下表所示:
&#20540;和含义
类的版本号,默认&#20540;是1.0
Description
ClassID & & & & & & & & & & & & & & & & & & & & & & & &&
类的ID(COM中用来唯一确定一个类的方式)
InterfaceID
接口ID(COM中用来唯一确定接口的方式)
DefaultProperty
DefaultSignal
默认的时间
LicenseKey
类的许可号,默认未开启,如果开启使用类需要许可号
StockEvents
ToSuperClass
暴露父类的接口
Insertable
设置&yes&后可以被列到OLE2容器中,默认未设置
Aggregatable
默认是&yes&,COM支持聚合
设置为“no”调用者不能使用该类
RegisterObject
仅能用在进程外方式的COM中
该COM控件支持的文件&#26684;式描述
CoClassAlias
类的名称在IDL中被修改为CoClassAlias指定的名字
继续上面的代码,接下来可以添加一些属性到COM组件中,可以使用另一个宏Q_PROPERTY
Q_PROPERTY(int value READ value WRITE setValue)之后可以像写Qt程序那样来完成。
MyActiveX(QWidget *parent = 0)
int value()
public slots:
void setValue(int v);
void valueChange(int v);
};Qt的ActiveX框架会将Qt类中的要素转换为COM中的标准要素供其他调用者使用,具体来说:
&1. &Qt类中的属性和公有的插槽函数(slots)会被转换为COM中的属性和方法
&2. &Qt类中的信号(signals)会被转换成为COM组件中的事件
另外其他的数据类型转换之间的对应关系如下图所示:
&1. Qt中属性的数据类型与COM中数据类型的转换关系如下:
Qt数据类型
COM 属性数据类型
VARIANT_BOOL
unsigned int
qulonglong
IFontDisp*
IPixtureDisp*
QVariantList & & & & &&
SAFEARRAY(VARIANT)
QStringList
SAFEARRAY(BSTR)
QByteArray
SAFEARRAY(BYTE)
User defined type
User defined type
User defined type
2. Qt中信号和插槽函数的形式参数数据类型
Qt数据类型
对应COM的数据类型
[in] VARIANT_BOOL
[in,out] VARIANT_BOOL*
QString, const Qtring&
[in, out] BSTR*
[in, out] BSTR*
[in, out]int
[in,out]unsigned int
[int, out] unsigned int*
[in] double
QColor, const QColor&
[in] OLE_COLOR
[in,out] OLE_COLOR*
QDate, const QDate&
[in,out]DATE*
QDateTime, const QDateTime&
QDateTime&
[in,out]DATE*
QFont, const QFont&
[in] IFontDisp*
[in,out]IFontDisp**
QPixmap, const QPixmap&
[in]IPictureDisp*
[in,out]IPictureDisp**
QList&QVariant&
[in]SAFEARRAY(VARIANT)
QList&QVariant&&
[in,out]SAFEARRAY(VARIANT)*
[in] IDispatch*
此外QActiveX也可以通过Q_ENUMS和Q_FLAGS将枚举变量导出,如果使用了非上表中的类型来作为信号和插槽函数的参数类型,那么Qt ActiveX框架不会转换这些参数。
发布COM控件
为了让Qt编写的代码可以作为一个COM组件被使用,必须提供获取COM对象的方法,在Qt中使用QAxFactory来完成,最简单的方法是使用下面的宏:
QAXFACTORY_BEGIN(&{ad9e-4e8b-9a91-0a6dc5f6461f}&,
&{a8f-4f6a-b939-d83}&)
QAXCLASS(MyWidget)
QAXCLASS(MyWidget2)
QAXTYPE(MySubType)
QAXFACTORY_END()上面这段代码把MyWidget和MyWidget2导出为可供外部调用的COM对象,并注册MySubType类型可供MyWidget和MyWidget2中的属性和参数使用。
进程外COM控件的编写
对于进程外可执行的COM组件,我们需要执行一个main函数来实例化一个QApplication,和一般的Qt程序类&#20284;。
#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();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91441次
积分:1967
积分:1967
排名:第11738名
原创:104篇
评论:62条
文章:52篇
阅读:46367
(1)(2)(1)(3)(4)(7)(1)(3)(1)(2)(6)(7)(16)(17)(10)(9)(9)(8)}

我要回帖

更多关于 qt activex控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信