QT调用COM组件

来源:互联网 发布:工程软件工作量估计 编辑:程序博客网 时间:2024/05/19 12:29

COM使用

  • 首先调用 CoInitialize(NULL) 初始化COM库

  • CoCreateInstance(....) 创建COM对象并获得接口

    • 使用
    • 使用
    • 释放COM对象
  • 最后 CoUnInitialize() 收回COM库

QAxObject

  • 和 QAxWidget 一样,它封装的是前面提到的中间部分:对象的创建及删除

问题出来了,为什么一般情况下,我们使用QAxObject的时候,都没有调用 CoInitialize 呢?

为什么呢?为什么呢?因为是 QAppliction 的主线程中。

QApplication

为了清楚起见,直接看源码吧

src/gui/kernel/qapplication_win.cpp

先看初始化时做了什么

void qt_init(QApplicationPrivate *priv, int) { ...   HRESULT r;   r = OleInitialize(0);   if (r != S_OK && r != S_FALSE) {      qWarning("Qt: Could not initialize OLE (error %x)", (unsigned int)r);   } ...}

再看看退出时做了什么

void qt_cleanup() { ...         // Deinitialize OLE/COM    OleUninitialize();}

之所以这样做,是因为windows下拖放操作的实现需要COM的操作。

而这样一来,在QApplication的主线程中,我们也就不需要自己去初始化COM库了。

次线程

当我们在次线程中使用 QAxObject 时,由于QThread不会为我们的次线程做COM初始化的操作,所以就必须自己在次线程中调用这两个函数了。

同样,当我们使用 QCoreApplication 时,也需要自己来初始化。

[喝小酒的网摘]http://blog.hehehehehe.cn/a/4032.htm
相关文章
  • windows下 Qt 静态编译似乎一直没有静态编译Qt的需求:一不在没有管理员权限的机器上使用,二不制作绿色软件,三...。动态编译工作得很好,再配合 nsis 制作一个安装包,有什么必要静态编译呢? 但论坛中似乎总是不停有人问到静态编译的问题,似乎遇到问题的人挺多,用百度或google搜索"Qt静态编译"也能搜到相当多的内容。 正好利用周末时间,自己尝试编译一下,顺便整理一下,看看到底会发生什么(
  • Qt 程序在 windows 下的发布这个问题,其实 Qt 的 manual 中解释的已经比较清楚了。下面是我根据自己的理解和实验后写的东西,希望比Qt文档容易理解一点。 另外:你可能对 Qt 插件学习(一) 感兴趣。如果需要制作安装程序,请访问 NSIS学习笔记(以Qt4程序打包为例) 下面不涉及静态编译(静态编译可以看看这儿),只包含动态编译(也就是Qt默认的情况),主要又分
  • Qt中translate、tr关系 与中文问题题外话:何时使用 tr ?

    在论坛中漂,经常遇到有人遇到tr相关的问题。用tr的有两类人:

    (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr
    (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:
    (2a) 用tr包住英文(最最推荐的用法,源码英文
  • QT QSettings与中文本文介绍的是QSettings的 IniFormat 截止目前(Qt4.7)对中文的支持情况,如果你想实现自己定义格式(比如"[中文] 中文=中文"这样),可参看 QSettings 自定义格式
    Qt4.4(包含)之前

    先看个例子:

    #include <QtCore/QCoreApplication
  • QT QString与中文问题首先呢,声明一下,QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给QString。

    很简单的问题,"我是中文"这样写的时候,它是传统的 char 类型的窄字符串,我们需要的只不过是通过某种方式告诉QString 这四个汉字采用的那种编码。而问题一般都出在很多用户对自己当前
  • 0 1