com 名字对象(2)创建名字对象(IMoniker)
2011-07-26 20:31 Clingingboy 阅读(2357) 评论(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);