• 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);
    
  • 相关阅读:
    【软件测试】软件缺陷粗浅认识及白盒测试举例
    【软件测试】等价类划分
    【软件测试】对本门课程粗浅理解
    阿里云服务器本地ping超时,远程可以正常ping通
    不忘初心
    开源框架、控件、组件、插件记录
    Flex中窗口可随意拖拽功能实现
    初探数据类型相关问题
    [TSCTF-J 2021] 解题报告
    指针
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2117628.html
Copyright © 2020-2023  润新知