IDataObject详解

第二部分我们介绍了OLE数据传输的相关知识,这一节主要讲怎么实现一个IDataObject接口。然后再给出一个例子。

首先我们要明白,IDataObject是一个COM接口,我们就必须得创建一个类,实现这个接口的每一个方法,包括它的基类的方法。

1. SdkDataObject.h 头文件: 

[cpp]  view plain copy
  1. #ifdef __cplusplus  
  2. #ifndef _SDKDATAOBJECT_H_  
  3. #define _SDKDATAOBJECT_H_  
  4.   
  5. #include "SdkCommon.h"  
  6. #include "SdkDropSource.h"  
  7.   
  8.   
  9. typedef struct _DATASTORAGE  
  10. {  
  11.     FORMATETC *m_formatEtc;  
  12.     STGMEDIUM *m_stgMedium;  
  13.   
  14. } DATASTORAGE_t, *LPDATASTORAGE_t;  
  15.   
  16. class CLASS_DECLSPEC SdkDataObject : public IDataObject  
  17. {  
  18. public:  
  19.   
  20.     SdkDataObject(SdkDropSource *pDropSource = NULL);  
  21.     BOOL IsDataAvailable(CLIPFORMAT cfFormat);  
  22.     BOOL GetGlobalData(CLIPFORMAT cfFormat, void **ppData);  
  23.     BOOL GetGlobalDataArray(CLIPFORMAT cfFormat,   
  24.         HGLOBAL *pDataArray, DWORD dwCount);  
  25.     BOOL SetGlobalData(CLIPFORMAT cfFormat, void *pData, BOOL fRelease = TRUE);  
  26.     BOOL SetGlobalDataArray(CLIPFORMAT cfFormat,   
  27.         HGLOBAL *pDataArray, DWORD dwCount, BOOL fRelease = TRUE);  
  28.     BOOL SetDropTip(DROPIMAGETYPE type, PCWSTR pszMsg, PCWSTR pszInsert);  
  29.    
  30.     // The com interface.  
  31.     IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv);  
  32.     IFACEMETHODIMP_(ULONG) AddRef();  
  33.     IFACEMETHODIMP_(ULONG) Release();  
  34.     IFACEMETHODIMP GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium);  
  35.     IFACEMETHODIMP SetData(FORMATETC *pformatetc,  
  36.         STGMEDIUM *pmedium, BOOL fRelease);  
  37.     IFACEMETHODIMP GetDataHere(FORMATETC *pformatetc , STGMEDIUM *pmedium );  
  38.     IFACEMETHODIMP QueryGetData(FORMATETC *pformatetc);  
  39.     IFACEMETHODIMP GetCanonicalFormatEtc(FORMATETC *pformatetcIn,    
  40.         FORMATETC *pformatetcOut);  
  41.     IFACEMETHODIMP EnumFormatEtc(DWORD dwDirection,   
  42.         IEnumFORMATETC **ppenumFormatEtc);  
  43.     IFACEMETHODIMP DAdvise(FORMATETC *pformatetc , DWORD advf ,   
  44.         IAdviseSink *pAdvSnk , DWORD *pdwConnection);  
  45.     IFACEMETHODIMP DUnadvise(DWORD dwConnection);  
  46.     IFACEMETHODIMP EnumDAdvise(IEnumSTATDATA **ppenumAdvise);  
  47.   
  48. private:  
  49.   
  50.     ~SdkDataObject(void);  
  51.     SdkDataObject(const SdkDataObject&);  
  52.     SdkDataObject& operator = (const SdkDataObject&);  
  53.     HRESULT CopyMedium(STGMEDIUM* pMedDest,   
  54.        STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);  
  55.     HRESULT SetBlob(CLIPFORMAT cf, const void *pvBlob, UINT cbBlob);  
  56.   
  57. private:  
  58.   
  59.     //!< The reference of count  
  60.     volatile LONG           m_lRefCount;        
  61.     //!< The pointer to CDropSource object    
  62.     SdkDropSource          *m_pDropSource;    
  63.     //!< The collection of DATASTORAGE_t structure      
  64.     vector<DATASTORAGE_t>   m_dataStorageCL;      
  65. };  
  66.   
  67. #endif // _SDKDATAOBJECT_H_  
  68. #endif // __cplusplu
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值