当前位置:  技术问答>linux和unix

★★ Qt 中有跨平台的 COM 组件开发库 ★★

    来源: 互联网  发布时间:2015-06-15

    本文导语:  看 Qt 源代码时发现的, 原来 Qt 中 Plugin 使用的都是类 COM 接口... | 如何在一个 COM Server 中定义多个 COM ("Multiple Components in One Component Server")?  答:其实那篇文章已经讲得很清楚...

看 Qt 源代码时发现的,
原来 Qt 中 Plugin 使用的都是类 COM 接口...

|
如何在一个 COM Server 中定义多个 COM ("Multiple Components in One Component Server")? 
答:其实那篇文章已经讲得很清楚了,为了要在一个COM Server 中定义多个 COM,
关键在于定义一个自己的组件工厂类(ComponentFactory),即你需要从QComponentFactoryInterface派生一个组件工厂类,并重新实现createInstance()
接口函数。具体过程如下:
(1)首先定义那几个实现不同功能的COM对象,记得为每个COM对象生成一个UUID,例如
class Component1...
{
public:
    ...
    static QUuid CID;
    ...
};
QUuid Component1::CID = QUuid( 0xDD19964B, 0xA2C8, 0x42AE,
        0xAA, 0xF9, 0x8A, 0xDC, 0x50, 0x9B, 0xCA, 0x03 );

class Component2...
{
public:
    ...
    static QUuid CID;
    ...
};
QUuid Component2::CID = QUuid( 0xDD19964B, 0xA2C8, 0x42AE,
        0xAA, 0xF9, 0x8A, 0xDC, 0x50, 0x9B, 0xCA, 0x04 );

(2)定义一个组件工厂类,记得为该工厂类生成一个UUID,例如
class ComponentFactoryName: QComponentFactoryInterface
{
public:
//存放对象实例的指针
Component1 *comp1;
Component2 *comp2;
createInstance( const QUuid &cid, const QUuid &iid,
                                          QUnknownInterface** iface,
                                          QUnknownInterface *outer );
QRESULT queryInterface( const QUuid &uuid,
                                         QUnknownInterface **iface )

};
重新实现createInstance()和queryInterface()接口函数
QRESULT ComponentFactoryName::createInstance( const QUuid &cid, const QUuid &iid,
                                          QUnknownInterface** iface,
                                          QUnknownInterface *outer )
{
    QRESULT res = QE_NOCOMPONENT;
    if ( cid == Component1::CID ) {
        comp1 = new Component1;
        res = comp1->queryInterface( iid, iface );
        if ( res != QS_OK )
            delete comp1;
    } else if ( cid == Component2::CID ) {
        Component2 *comp2= new Component2;
        res = comp2->queryInterface( iid, iface );
        if ( res != QS_OK )
            delete comp2;
    }
    return res;
}


QRESULT  ComponentFactoryName:: queryInterface( const QUuid &uuid,
                                         QUnknownInterface **iface )
{
//先检查第一个组件有无要查询的Quuid接口,如无则检查第二组件,依次类推
QRESULT res = QE_NOCOMPONENT;
QunknownInterface * iface;
res = comp1->queryInterface(uuid, &iface );
if (res == QE_NOCOMPONENT)
        { 
      res = comp2->queryInterface( uuid , &face);
        }
    return res;
}
(3)将上述定义的组件工厂类视作组件服务器的一个组件(component),
将其导出,导出函数定义如下
Q_EXPORT_COMPONENT()
{
    ComponentFactoryName *comp = new ComponentFactoryName;
    QUnknownInterface *iface;
    //实例化所有的组件
    comp->createInstance(cid1,iid1, &iface );
comp->createInstance(cid2,iid2, &iface );
//返回工厂类的缺省组件的接口指针(例如将组件1视为缺省组件)
    comp->queryInterface( IID_COM1, &iface );

    return iface;
}



    
 
 

您可能感兴趣的文章:

  • .NET下 c#通过COM组件操作并导出Excel实例代码
  • ###java调用COM组件或COM调用java组件(EJB)解决办法。###
  • Java能否写COM组件?
  • 用JAVA编写COM组件
  • 多媒体叠加COM组件 ansoply
  • java中如何调com组件?在线送分。
  • linux下有没有象windows下COM一样的组件技术???
  • 如何让java使用com组件(只要你的意见有用,一定给分)
  • 请教!目前有没有在linux下使用COM组件的方法
  • 很急!JSP中如何通过JavaBeans去访问COM组件?
  • C++ COM编程之什么是组件?
  • 请问在jsp里能调用COM组件么?
  • C# 无需COM组件创建快捷方式的实现代码
  • 在jsp程序中使用com组件
  • PHP调用VC编写的COM组件实例
  • 利用微软com组件mstscax.dll实现window7远程桌面功能
  • Python编写的com组件发生R6034错误的原因与解决办法
  • XML-RPC的COM组件 comxmlrpc
  • jbuilder怎么调用VC的COM组件?我刚开始接触jbuilder
  • c#创建vc可调用的com组件方法分享
  • jbuilder6开发时如何加入com.sybase.jdbc.SybDriver?让它可以连接sybase数据库
  • 诚邀具有JAVA开发经验且英语水平过硬的开发人员一起来翻译J2SDK标准版V1.4.0 API文档和J2EE1.3 API文档,完成后将放在网上共享下载,详情到网站http://china-programer.myrice.com/
  • 我要晕倒了,怎么在java.sun.com/products/servlet下找不到servlet的开发包在哪下载,1个小时都浪费了,帮忙啦*_*
  • China.com网站开发规范第1/2页
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sendmail如何配置多个邮件域名,在局域网内 如 aaa@aaa.com;aaa@bbb.com,
  • 我编一个程序要控制端口Com1,但手头没有那个设备,谁知道哪里有能模拟Com端口的软件!!!!!!
  • 关于apache ,端口该为8080,想http://www.as.com访问,而不是www.as.com:8080
  • import com.sun.java.swing.*;提示找不到com.sun.java包我该怎么办?急!
  • com.borland.dbswing.* 在什么文件里啊?可以发给我一个吗?Rex_fa@163.com 告诉我也行
  • 谁知道类似于my.sina.com.cn和cn.my.yahoo.com中的版面个性化定制的原理是什么?
  • 比如进入a.com,怎么自动过3秒转入bb.com?
  • com.Oracle.*;是指相对于当前目录下的COM下的ORACLE吗?java是怎么寻找PACKAGE的?
  • Foursquare.com的客户端 Foursquare
  • 便携软件套装 PortableApps.com
  • Use COM in java
  • 怎么去配置COM口?
  • DNS问题 http://ooo.com 不能访问
  • java如何调用com?
  • 我的代码中已经假如smtp认证,为什么在tomcat上还提示客户端没有验证?使用smtp.sohu.com或smtp.sina.com.cn都不行代码如下:
  • 有谁能给我电子白板的源代码???急!!!!!!guangmin001@china.com
  • 不解决也给分。com1连机很慢?
  • 请问COM技术和WEB技术有什么区别和联系?在线等
  • ●●●看了个脚本,${mydomain:-"xk.com"} 不懂,哪位高人可否指点●●●
  • Java和DLL(COM)互操作 Jawin


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3