zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1518797.html
Copyright © 2011-2022 走看看