• com学习笔记(6)类厂


    一.CoCreateInstance

    STDAPI CoCreateInstance(

      REFCLSID rclsid, //创建的Com对象的类标识符(CLSID)

      LPUNKNOWN pUnkOuter, //指向接口IUnknown的指针

      DWORD dwClsContext, //运行可执行代码的上下文

      REFIID riid, //创建的Com对象的接口标识符

      LPVOID * ppv //用来接收指向Com对象接口地址的指针变量

      );

      参数:

      rclsid

      [in] 用来唯一标识一个对象的CLSID(128位),需要用它来创建指定对象。

      pUnkOuter

      [in] 如果为NULL, 表明此对象不是聚合式对象一部分。如果不是NULL, 则指针指向一个聚合式对象的IUnknown接口。

      dwClsContext

      [in] 组件类别. 可使用CLSCTX枚举器中预定义的值.

      riid

      [in] 引用接口标识符,用来与对象通信。

      ppv

      [out] 用来接收指向接口地址的指针变量。如果函数调用成功,*ppv包括请求的接口指针。

    调用此函数需先调用CoInitialize方法初始化COM库

    最后调用CoUninitialize释放资源

    http://baike.baidu.com/view/1141927.htm

    一般情况下,该方法即可满足

    int main()
    {
        // Initialize COM Library
        CoInitialize(NULL) ;
    
        trace("Call CoCreateInstance to create") ;
        trace("  component and get interface IX.") ;
        IX* pIX = NULL ; 
        HRESULT hr = ::CoCreateInstance(CLSID_Component1,
                                        NULL, 
                                        CLSCTX_INPROC_SERVER,
                                        IID_IX, 
                                        (void**)&pIX) ;
        if (SUCCEEDED(hr))
        {
            trace("Succeeded getting IX.") ;
            pIX->Fx() ;          // Use interface IX.       
            trace("Release IX interface.") ;
            pIX->Release() ;
        }
        else
        {
            cout << "Client: \t\tCould not create component. hr = "
                 << hex << hr << endl ;    
        }
    
        // Uninitialize COM Library
        CoUninitialize() ;
    
        return 0 ;
    }

     

    二.CoCreateInstance的实现

      CoCreateInstance帮助者函数通过使用对象的CLSID,提供了一种便洁的方式与类对象连接,创建未初始化的实例,以及释放类对象。它封装了以下的功能:

    CoGetClassObject(rclsid, dwClsContext, NULL, IID_IClassFactory, &pCF);
    
    hresult = pCF->CreateInstance(pUnkOuter, riid, ppvObj);
    
    pCF->Release();

     

    三.类厂

    当在本机中只创建一个对象时,调用CoCreateInstance是最方便的;如果要在远程系统中创建一个对象时,可以调用CoCreateInstanceEx;创建多个同一CLSID的对象时, 可以参考 CoGetClassObject 函数;如果创建多个对象实例,可以获得类对象的IClassFactory 接口指针,并使用需要的方法,可以使用CoGetClassObject函数。

    http://blog.csdn.net/qlping2007/archive/2008/04/01/2237155.aspx

  • 相关阅读:
    Java内存模型之从JMM角度分析DCL
    MySQL系列(九)--InnoDB索引原理
    MySQL系列(一)--基础知识(转载)
    MySQL系列(八)--数据库分库分表
    MySQL系列(七)--SQL优化的步骤
    MySQL系列(六)--索引优化
    MySQL系列(五)--二进制日志对主从复制的影响
    Java集合(七)--基于jdk1.8的HashMap源码
    Java数据结构和算法(八)--红黑树与2-3树
    Java数据结构和算法(七)--AVL树
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1518797.html
Copyright © 2020-2023  润新知