代码改变世界

com学习笔记(6)类厂

  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

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2007-07-07 ComponentArt控件分析之ComboBox(2)
点击右上角即可分享
微信分享提示