代码改变世界

com学习笔记(6)类厂

2009-07-07 23:37  Clingingboy  阅读(551)  评论(0编辑  收藏  举报

 

一.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