如何用ActiveQt写导出类

最近一直在用ActiveQt框架来写ActiveX插件, 由于项目需要提示类的导出, 所以上午捣鼓了一下, 现在记录记录.

其实内容主要是把Qt手册里自己用到的部分整理一下而已.

导出类的编写
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

用ActiveQt框架写导出类, 主要注意几点:

1. 派生关系

这里要注意必须要从QObject或它的派生类派生, 并且QObject要放在第一个. 也就是说, 如果你的类要从多个类派生的话, 必须写成这样:
   
.. code:: c++
   
    class MyClass : public QObject, public MyBase
    {
        Q_OBJECT
        ......
    };

2. 至少要写三个Q_CLASSINFO的宏

这里直接上代码吧, 写过ActiveX的应该都懂的:
   
.. code:: c++
   
    Q_CLASSINFO("ClassID", "{60843C25-C9E9-4879-9FD1-9FFF60562DE0}")
    Q_CLASSINFO("InterfaceID", "{FD3EB53C-E78A-468b-B776-9915B4224EB0}")
    Q_CLASSINFO("EventsID", "{BFF922AB-4F38-435c-A190-FECCC6EE5041}")

这里的uuid可以用相关的功能生成, windows自带了, 我用的是``guidgen``.

3. 要保证与页面交互正常, 需要再从QAxBindable派生, 重写``QAxAggregated* createAggregate();``函数

重载这个接口, 是为了让IE认为你是安全的控件, 避免出现下面这个对话框:
   
.. image:: /galleries/ie.png


   
重载的函数也很简单:
   
.. code:: c++
   
    QAxAggregated* ModelNode::createAggregate()
    {
        return new ObjectSafetyImpl;
    }
       
这里的``ObjectSafetyImpl``是有点讲究, 不过在Qt的手册里也给出了这个类的标准写法, 直接照搬就可以, 这里给个范例:
   
.. code:: c++
   
    #include <QAxAggregated>
    #include <objsafe.h>
    #include <QUuid>

    class ObjectSafetyImpl : public QAxAggregated, public IObjectSafety
    {
    public:
        ObjectSafetyImpl() {}

        QAXAGG_IUNKNOWN;

         long queryInterface( const QUuid &iid, void **iface )
         {
            *iface = 0;
            if ( iid == IID_IObjectSafety )
                *iface = (IObjectSafety*)this;
            else
                return E_NOINTERFACE;

            AddRef();
            return S_OK;
        }

        HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )
        {
            *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
            *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
            return S_OK;
        }

        HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions )
        {
              return S_OK;
        }
    };
       
用的时候, 把这个类保存为一个.h文件用就可以了.
   
**注意** 必须保存成.h, 不要把成员函数的实现再放到.cpp里, 因为这是一个模板类!!! *切记*

搞完上面的三步, 一个导出类就折腾得差不多了, 剩下的就是丰富一下这个类, 比如添加属性, 方法, 还有信号之类的.

类的导出
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

类搞完了, 就得导出不是. 这里用到的是``QAxFactory``, 不过咱这里不直接用这个类, 而是用它的几个宏就OK了.

.. code:: c++

    QAXFACTORY_BEGIN(
         "{F6D80CD5-446D-41DE-9859-F519FF49B970}",
         "{435A18EC-4836-4EFD-8117-D6484752A6F8}")
         QAXCLASS(ActiveOSG)
         QAXCLASS(ModelNode)
    QAXFACTORY_END()
   
这里的第一个uuid是typeid, 第二个是application id. 也都是ActiveX需要的东西

下面的东西就是我们要注意的, 这里ActiveQt框架提供了两个宏:

* ``QAXCLASS``
* ``QAXTYPE``

两者唯一的区别就是``QAXTYPE``导出的类不能直接创建, 只能用在导出类或函数的参数中, 也就是不能直接实例化.

所以在实际上, 我一般都是直接用``QAXCLASS``的.

小结
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

总的来说, ActiveQt框架用起来还是比直接写ActiveX插件来得爽快些, 需要注意的地方不多, 但代码就清爽多了.

如何用ActiveQt写导出类的更多相关文章

  1. 实战MEF(3):只导出类的成员

    通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...

  2. C#调用C++导出类(转)

    由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...

  3. MEF只导出类的成员

    MEF只导出类的成员 通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放 ...

  4. C#调用C++导出类的一个实例

    一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了.https://blog.csdn.net/huiyouyongdeyu2011/article/d ...

  5. C++ DLL导出类 知识大全

    在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...

  6. MinGW dll导入导出类

    dll不仅可以导入导出函数,还可以导入导出类.这篇文章就来介绍如何将类导入dll中并导出. 首先我们建立一个名为dll.cpp的文件(又是这种破名字),里面写上: #include <iostr ...

  7. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  8. asp.net(C#) Excel导出类 导出.xls文件

    ---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft   Excel   11.0   Obje ...

  9. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

随机推荐

  1. 关于Mesos和Kubernetes的区别

    这个主题应该和服务发现注册一样,进入视野...

  2. OCJP(1Z0-851) 模拟题分析(九)over

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  3. 深入剖析iLBC的丢包补偿技术(PLC)

    转自:http://blog.csdn.net/wanggp_2007/article/details/5136609 丢包补偿技术(Packet Loss Concealment——PLC)是iLB ...

  4. usb设备驱动描述,王明学learn

    usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...

  5. win7 快捷键

    F F1 显示辅助 F2 重命名选定项目 F3 搜索文件或文件夹 F4 在 Windows 资源管理器中显示地址栏列表 F5 刷新活动窗口 F6 在窗口中或桌面上循环切换屏幕元素 F10 激活活动程序 ...

  6. 工厂模式/factory模式/创建型模式

    工厂模式 普通工厂模式 原本需要new出来的对象,通过一个类的方法去搞定,Factory.build(parameter),类似这种. public interface Sender { public ...

  7. eclipse中快捷键

    转为大写  ctrl+shift+x 转为小写  ctrl+shift+y 根据类名快速找到类文件 ctrl+shift+r 返回上一级 ALT  +  <- 速定位到某一行 ctrl+L

  8. Android 大牛的 blog 值得推荐 (转 整理)

    1 收集了 国外著名开发者 25 人,包括 Github 地址.Blog 地址以及重点贡献介绍 链接 收集了 国内部分开发者 32人,包括 Github 地址.Blog 地址以及重点贡献介绍, 链接 ...

  9. Android之Adapter用法总结(转)

    Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid Vie ...

  10. 智能车学习(二十三)——浅谈心得体会

          因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性 ...