zoukankan      html  css  js  c++  java
  • com 名字对象(2)创建名字对象(IMoniker)

    1.文件名字对象

    IUnknown* pUnk = NULL;
    IMoniker* moniker2=NULL;
    CreateFileMoniker(OLESTR("E:\\test.xlsx"),&moniker2);
    //another way(bind) to get IUnknown
    //get pUnk from moniker2
    hr =moniker2->BindToObject(bindCtx,NULL,IID_IUnknown, (void**)&pUnk);
    

    2.单项名字对象

    IMoniker* moniker2=NULL;
    CreateFileMoniker(OLESTR("E:\\test.xlsx"),&moniker2);
    IMoniker* moniker3=NULL;
    CreateItemMoniker(OLESTR("!"),OLESTR("Sheet1"),&moniker3);
    


    3.根据显示名创建名字对象

    const OLECHAR bb[]=OLESTR("clsid:120B72A0-65BF-11D0-9DDC-00A0C9034892");
    IBindCtx* bindCtx=NULL;
    CreateBindCtx(0,&bindCtx);
    ULONG cchEaten; 
    IMoniker* moniker2=NULL;
    hr=MkParseDisplayName(bindCtx,bb,&cchEaten,&moniker2);
    IClassFactory* cf=0;
    hr=moniker2->BindToObject(bindCtx,NULL,IID_IClassFactory,(void**)&cf);
    hr=cf->CreateInstance(0,IID_IUnknown,(void**)&pUnk);
    

    以上代码跟下面效果是一样的

    CoCreateInstance(CLSID_DuckDoer, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnk);
    

    IMoniker用BindToObject创建组件对象

    4.创建类名字对象(CreateClassMoniker)

    IMoniker* moniker2=NULL;
    //const OLECHAR bb[]=OLESTR("clsid:120B72A0-65BF-11D0-9DDC-00A0C9034892");
    //ULONG cchEaten; 
    //hr=MkParseDisplayName(bindCtx,bb,&cchEaten,&moniker2);
    hr=CreateClassMoniker(CLSID_DuckDoer,&moniker2);
    

    CreateClassMoniker可以根据CLSID来创建,与注释掉部分效果相同

    5.创建名字复合对象

    CreateFileMoniker(OLESTR("E:\\test.xlsx!Sheet1!R1C1:R2C2"),&moniker2);
    IMoniker* moniker3=NULL;
    CreateItemMoniker(OLESTR("!"),OLESTR("Sheet1"),&moniker3);
    IMoniker* moniker4=NULL;
    CreateGenericComposite(moniker2,moniker3,&moniker4);
    

    可以将一个文件名字对象和单项名字对象组合成一个复合名字对象,单项名字对象单独存在并无价值

    6.创建指针名字对象

    可以基于一个现有的IUnknown 接口指针创建名字对象

    HRESULT hr;
    IUnknown* pUnk = NULL;
    hr = CoCreateInstance(CLSID_DuckDoer, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnk);
    IBindCtx* bindCtx=NULL;
    CreateBindCtx(0,&bindCtx);
    IMoniker* moniker2=NULL;
    CreatePointerMoniker(pUnk,&moniker2);
    IConnectionPointContainer* pConnPtContainer = NULL;
    IConnectionPointContainer* pConnPtContainer2 = NULL;
    pUnk->QueryInterface(IID_IConnectionPointContainer, (void**)&pConnPtContainer2);
    //equal
    moniker2->BindToObject(bindCtx,NULL,IID_IConnectionPointContainer,(void**)&pConnPtContainer);
    

    7.获取文件相关联的CLSID(GetClassFile)

    并非每种类型的文件都有相关联的CLSID

    IMoniker* moniker2=NULL;
    CLSID fileId;
    GetClassFile(OLESTR("E:\\test.xlsx"),&fileId);
    CreateClassMoniker(fileId,&moniker2);
    

    参考:http://wenku.baidu.com/view/d946e41eb7360b4c2e3f64b1.html

    8.CoGetObject

    CoGetObject是对第3步的封装

    const OLECHAR bb[]=OLESTR("clsid:120B72A0-65BF-11D0-9DDC-00A0C9034892");
    IClassFactory* cf = NULL;
    CoGetObject(bb,0,IID_IClassFactory, (void**)&cf);
    IUnknown* pUnk = NULL;
    cf->CreateInstance(0,IID_IUnknown,(void**)&pUnk);
    
  • 相关阅读:
    VMware centos7 网络设置
    PostgreSQL 执行进度监控:VACUUM 、ANALYZE、CREATE INDEX 、CLUSTER、Base Backup
    PostgreSQL: Hash Semi Join
    事务隔离级别实验--SQL在等待锁结束之后,是否会再次获取快照
    转:PostgreSQL WAL解析与闪回的一些想法
    PostgreSQL Event trigger 使用记录:阻断危险SQL、记录DDL操作
    转:PgSQL · 特性分析 · Write-Ahead Logging机制浅析
    mongo使用问题记录
    goldplayer h265播放器
    在线书籍
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2117628.html
Copyright © 2011-2022 走看看