如何用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. 锁ReaderWriterLockSlim介绍

    概述 ReaderWriterLockSlim 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问: 常用的方法: cacheLock.EnterReadLock();//加上读取锁 ...

  2. SQLAlchemy Core插入数据,有好几种方法呢

    看是一次插入一条还是多条, 看是数据表名是变量还是常量, 操作还是很灵活的, 主要看哪种顺手顺眼啦. #coding=utf-8 from datetime import datetime from ...

  3. org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:

    详细错误堆栈信息: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" ...

  4. 如何通过阅读C标准来解决C语言语法问题

    有时候必须非常专注地阅读ANSI C标准才能找到某个问题的答案.一位销售工程师把下面这段代码作为测试用例发给Sun的编译小组. foo(const char **p) {} int main(int ...

  5. 中断处理流程,ok6410

    中断处理流程 CPU在工作的过程中,经常需要与外设进行交互,交互的方式包括”轮询方式”,”中断方式”. 1.轮询方式: CPU不断地查询设备的状态.该方式实现比较简单,但CPU利用率很低,不适合多任务 ...

  6. pythonchallenge之C++学习篇-02

    第二关任然是一个字符处理的关卡 查看网页源码发现有一大串字符需要处理,这么多的字符如果放在源代码里就很不好了 所以要用到C++对文件的操作,用到的头文件是fstream 这里参照了这个博文 对文件处理 ...

  7. pythonchallenge之C++学习篇-00

    前言 最近学习下C++,之前是python的用户,python解释器有诸多实现,其中最出名的要数C实现了,而且很多python的扩展模块可能要用C或者C++来写的,所以很有必要学习下C++了 为了避免 ...

  8. 智能车学习(二十一)——浅谈CCD交叉以及横线摆放

    一.CCD为何要交叉摆放?       首先使用横线摆放,CCD前瞻如果远一点,弯道丢线,再远一点直接窜道.所以需要很多很多代码的工作量,而且过弯的过程相当于没有任何的调节过程,就是一个偏差保持,或者 ...

  9. xUtils,butterknife...处理findviewbyid

      在写android中,经常要出现大量的findviewbyid et_path = (EditText) findViewById(R.id.et_path); tv_info = (TextVi ...

  10. banner无限轮播

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayou ...