代码改变世界

com 名字对象(2)创建名字对象(IMoniker)

2011-07-26 20:31  Clingingboy  阅读(2340)  评论(0编辑  收藏  举报

 

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);