如何用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. Python win32api提取exe图标icon

    转载地址: http://blog.csdn.net/gumanren/article/details/6129416 代码如下: # -*- coding: utf-8 -*- import sys ...

  2. sqlplus使用(二)

    详见SQL*Plus® User's Guide and Reference Release 11.2   5 Using Scripts in SQL*Plus   1.定义环境变量 _EDITOR ...

  3. Oracle优化的几个简单步骤

    数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等.还有的人认为要抓出执行最慢的语句来进行优化.但实际情况 ...

  4. Oracle 备份与恢复介绍

    一.Oracle备份方式分类:Oracle有两类备份方式:(1)物理备份:是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带.物理备份又分为冷备份.热备份:   (2)逻 ...

  5. ThinkPHP中使用ajaxReturn进行ajax交互

    以管理员登录为例来介绍下$this->ajaxReturn与模板页进行ajax交互使用方法 首先看PHP控制器的处理,在application/Admin/Controller/LoginCon ...

  6. Windows phone 8.0 本地化遇到的两个问题

    基本上来说,按照msdn来讲的,本地化和全球化没有太多的问题,链接如下: http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/ff ...

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

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

  8. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  9. Build better apps: Windows 10 by 10 development series

    http://blogs.windows.com/buildingapps/2015/08/05/build-better-apps-windows-10-by-10-development-seri ...

  10. 使用 json_in_java

    // */ // ]]> java_in_json Table of Contents 1. Java 使用 Json 1.1. 下载地址: 1.2. 构造 json 字符串 1.3. 解析 j ...