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

转载 2012年03月30日 14:56:04

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

c#根据字符串创建对象实例

在做项目中,有时候需要根据类的完全限定字符串,动态的实例化对象,在c#中有4种途径,下面的代码都是测试通过的 新建一个控制台应用程序,命名成ConsoleApplication1,添加HelloWo...
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年07月01日 12:11
  • 3249

C++实现反射(根据类名动态创建对象)

和网上大多数实现一样,本文也采用工厂方法来实现对象的动态创建,唯一不同的在于,本文的实现优化了类的注册,使用起来更为简单。废话不多说,直接上代码(这也没什么可说的,看代码更加直观)。 DynamicF...
  • heyuhang112
  • heyuhang112
  • 2016年06月21日 18:38
  • 2875

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新。之前在需要用到以上功能...
  • jiange_zh
  • jiange_zh
  • 2016年08月09日 22:33
  • 3393

java如何在文件中读取一个字符串并创建以这个字符为名字的类的对象

我们一般用properties或者XML文件作为资源存储的文件,现在主要介绍一下对properties的操作 1.我们在src文件下新建一个名称为config的包 2.在config下新建一个...
  • u014293306
  • u014293306
  • 2015年05月18日 21:22
  • 930

设计模式之1.1 再谈反射 以及java当中通过配置文件得到类名字,并生成对象的方法

感觉在设计模式当中,很多很多地方都要用到反射。尤其是从配置文件当中读取信息,并使用这个信息来动态加载。反射的应用特别常见,这里再一次的讨论反射和相关概念。   ClassLoader的类加载机制:...
  • utnewbear
  • utnewbear
  • 2012年12月31日 00:30
  • 1223

python的对象与名字绑定-----------好!

此文装载,对于理解python中的三个重要概念:名字、绑定和对象,以及python的思想和一些内部实现机制都很有帮助。见下: i = 1   这是一个再简单不过的赋值语句,即便...
  • yockie
  • yockie
  • 2013年01月06日 19:40
  • 1975

用java面向对象的内容建立学生姓名,学号,id,班级,每一科的成绩,以及对管理员实现(对老师只实现查看):通过名字查询成绩,通过学号查询成绩,通过id修改姓名,通过姓名修改成绩

这个问题如果用jsp和数据库的内容做那会非常简单,那么只用java面向对象来做呢?问题分析:本题首先需要建1.学生类2.班级类3.科目类4.对管理员和老师的接口(因为只有方法没有属性,用接口会简单一些...
  • V_loveqing
  • V_loveqing
  • 2017年08月09日 08:33
  • 664

Python中对象与名字的绑定

i = 1   这是一个再简单不过的赋值语句,即便是才开始学习编程的新手也能脱口而出它的含义 -- “设置变量i的值为1”。 i = 2   “将变量i的值改为2”,当看到接下来这行代码时,你脑...
  • tmackan
  • tmackan
  • 2013年05月19日 10:05
  • 636

Python进阶 - 对象,名字以及绑定

本文详细介绍了Python中的对象,名字,以及绑定
  • SakuraInLuoJia
  • SakuraInLuoJia
  • 2017年05月26日 18:11
  • 399

什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字

静态代码块?类加载就执行,最先执行 class demo{ static int num; static{ num=10; num*=3; System.out.println("haha"); } ...
  • swift2010
  • swift2010
  • 2018年01月01日 00:39
  • 48
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:com 名字对象(2)创建名字对象(IMoniker)
举报原因:
原因补充:

(最多只允许输入30个字)