com学习笔记(6)类厂

来源:互联网 发布:金融网络销售装美女 编辑:程序博客网 时间:2024/05/17 02:44

 

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

原创粉丝点击