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);
    
  • 相关阅读:
    JZOJ 3034. 【NOIP2012模拟10.17】独立集
    JZOJ 3035. 【NOIP2012模拟10.17】铁轨
    JZOJ 1259. 牛棚安排
    数位DP JZOJ 3316. 非回文数字
    JZOJ 3046. 游戏
    JZOJ 3013. 填充棋盘
    debian 安装oracle提供的java8
    java 汉字转拼音 PinYin4j
    debian ssh设置root权限登陆 Permission denied, please try again
    java并发下订单生成策略
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2117628.html
Copyright © 2011-2022 走看看