下次自动登录
现在的位置:
& 综合 & 正文
IDataObject详解
第二部分我们介绍了OLE数据传输的相关知识,这一节主要讲怎么实现一个IDataObject接口。然后再给出一个例子。
首先我们要明白,IDataObject是一个COM接口,我们就必须得创建一个类,实现这个接口的每一个方法,包括它的基类的方法。
1. SdkDataObject.h 头文件:
上面SdkDataObject.h定义了类SdkDataObject类,它实现了IDataObject接口,包括IUnknown接口。
几点说明如下:
1、SdkDataObject类里面也声明了拷贝构造、赋值操作符等,而且是私有的,就是不想让这个对象可以复制
2、IsDataAvailable:判断指定的格式是否支持。
3、GetGlobalData:得到全局的数据。
4、SetGlobalData:设置全局的数据。
5、CopyMedium:复制媒体数据。
6、上面列出的这些函数,几乎都是辅助函数,我设计时是根据我自己的业务需求来设计的,不同的需求可能不同,但最本质的都是实现一些COM接口。同时,我还定义了一个结构体DATASTORAGE_t,用来保存数据格式对,把设置的数据格式对存在一个vector中。
7、成员变量volatile LONG m_lRefCount,表示当前类的引用计数,构造函数一定要初始化为1,不能是0,其中volatile的意思就是说,告诉编译器不要其优化,每次要用访问这个值时,都是到它的地址上去取,而不是从寄存器中读取。
2. SdkDataObject.cpp的实现
2.1 构造函数
很简单,就是进行一些初始化操作,注意引用计数一定要是1,而不是0。
2.2 析构函数
负责释放内存,这个函数是私有的,调用者只能调用Release来释放它。
2.3 QueryInterface
内部实现最终也是调用API来实现:
2.4 AddRef和Release
方法就相对简单了,几乎所有的COM接口实现都一样。
2.5 GetData和SetData
相当重要的方法:就是向你写的Data Object要数据和传数据。内部必须把这些数据存起来。同时,这两个方法还依赖CopyMedium函数,这个用来复制数据。这个方法的实现后面会说明。GetDataHere这里没有实现,直接返回E_NOTIMPL。
2.6 QueryGetData函数
用来查询指定的数据是否支持,这个方法跟自己提供的IsDataAvailable功能相似,只是接口复杂一点,IsDataAvailable内部也是调用QueryGetData来实现的。
2.7 EnumFormatEtc函数
一般我是调用Shell API来实现,这个方法很重要,用来说明当前这个Data Object支持什么格式。目前这里面只支持CF_UNICODETEXT。
IDataObject::DAdvise、IDataObject::EnumDAdvise和IDataObject::DUnadivise函数简单的返回OLE_E_ADVISENOTSUPPORTED。
2.8 CopyMedium实现
下面给出了利用这个Data object 住剪切板复制一些数据。
这里调用了SetGlobalData函数来设置数据,上面没有给出这个实现,现在记住就行了,它内部是调用SetData来实现。设置的数据格式是CF_UNICODETEXT,因为目前这个DataObject只支持CF_UNICODETEXT格式,这个从EnumFormatEtc函数的实现就可以看出。你可以写一个控制台,加如下面两个方法,运行后,在记事本里按Ctrl
+ V,看看是不是把Hello World.粘贴了。
这一节,我们给出了SdkDataObject的实现,有些实现还是很简单,关键是要明白它的本质。
&&&&推荐文章:
【上篇】【下篇】