第二部分我们介绍了OLE数据传输的相关知识,这一节主要讲怎么实现一个IDataObject接口。然后再给出一个例子。
首先我们要明白,IDataObject是一个COM接口,我们就必须得创建一个类,实现这个接口的每一个方法,包括它的基类的方法。
1. SdkDataObject.h 头文件:
- #ifdef __cplusplus
- #ifndef _SDKDATAOBJECT_H_
- #define _SDKDATAOBJECT_H_
- #include "SdkCommon.h"
- #include "SdkDropSource.h"
- typedef struct _DATASTORAGE
- {
- FORMATETC *m_formatEtc;
- STGMEDIUM *m_stgMedium;
- } DATASTORAGE_t, *LPDATASTORAGE_t;
- class CLASS_DECLSPEC SdkDataObject : public IDataObject
- {
- public:
- SdkDataObject(SdkDropSource *pDropSource = NULL);
- BOOL IsDataAvailable(CLIPFORMAT cfFormat);
- BOOL GetGlobalData(CLIPFORMAT cfFormat, void **ppData);
- BOOL GetGlobalDataArray(CLIPFORMAT cfFormat,
- HGLOBAL *pDataArray, DWORD dwCount);
- BOOL SetGlobalData(CLIPFORMAT cfFormat, void *pData, BOOL fRelease = TRUE);
- BOOL SetGlobalDataArray(CLIPFORMAT cfFormat,
- HGLOBAL *pDataArray, DWORD dwCount, BOOL fRelease = TRUE);
- BOOL SetDropTip(DROPIMAGETYPE type, PCWSTR pszMsg, PCWSTR pszInsert);
- // The com interface.
- IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv);
- IFACEMETHODIMP_(ULONG) AddRef();
- IFACEMETHODIMP_(ULONG) Release();
- IFACEMETHODIMP GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium);
- IFACEMETHODIMP SetData(FORMATETC *pformatetc,
- STGMEDIUM *pmedium, BOOL fRelease);
- IFACEMETHODIMP GetDataHere(FORMATETC *pformatetc , STGMEDIUM *pmedium );
- IFACEMETHODIMP QueryGetData(FORMATETC *pformatetc);
- IFACEMETHODIMP GetCanonicalFormatEtc(FORMATETC *pformatetcIn,
- FORMATETC *pformatetcOut);
- IFACEMETHODIMP EnumFormatEtc(DWORD dwDirection,
- IEnumFORMATETC **ppenumFormatEtc);
- IFACEMETHODIMP DAdvise(FORMATETC *pformatetc , DWORD advf ,
- IAdviseSink *pAdvSnk , DWORD *pdwConnection);
- IFACEMETHODIMP DUnadvise(DWORD dwConnection);
- IFACEMETHODIMP EnumDAdvise(IEnumSTATDATA **ppenumAdvise);
- private:
- ~SdkDataObject(void);
- SdkDataObject(const SdkDataObject&);
- SdkDataObject& operator = (const SdkDataObject&);
- HRESULT CopyMedium(STGMEDIUM* pMedDest,
- STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
- HRESULT SetBlob(CLIPFORMAT cf, const void *pvBlob, UINT cbBlob);
- private:
- //!< The reference of count
- volatile LONG m_lRefCount;
- //!< The pointer to CDropSource object
- SdkDropSource *m_pDropSource;
- //!< The collection of DATASTORAGE_t structure
- vector<DATASTORAGE_t> m_dataStorageCL;
- };
- #endif // _SDKDATAOBJECT_H_
- #endif // __cplusplu