Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

197 lines
5.4 KiB

/*
* DATAOBJ.H
* Data Object Chapter 6
*
* Classes that implement the Data Object independent of whether
* we live in a DLL or EXE.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Right Reserved
*
* Kraig Brockschmidt, Software Design Engineer
* Microsoft Systems Developer Relations
*
* Internet : [email protected]
* Compuserve: >INTERNET:[email protected]
*/
#ifndef _DATAOBJ_H_
#define _DATAOBJ_H_
#define INC_OLE2
#include <windows.h>
#include <ole2.h>
#include "../my3216.h"
#include "../bookpart.h"
//Type for an object-destroyed callback
typedef void (PASCAL *PFNDESTROYED)(void);
/*
* The DataObject object is implemented in its own class with its
* own IUnknown to support aggregation. It contains one
* CImpIDataObject object that we use to implement the externally
* exposed interfaces.
*/
//DATAOBJ.CPP
#ifdef NOT_SIMPLE
LRESULT APIENTRY
AdvisorWndProc(HWND, UINT, WPARAM, LPARAM);
#endif /* NOT_SIMPLE */
class CImpIDataObject;
typedef class CImpIDataObject *PIMPIDATAOBJECT;
class CDataObject : public IUnknown
{
friend class CImpIDataObject;
#ifdef NOT_SIMPLE
friend LRESULT APIENTRY AdvisorWndProc(HWND, UINT
, WPARAM, LPARAM);
#endif /* NOT_SIMPLE */
protected:
ULONG m_cRef;
LPUNKNOWN m_pUnkOuter;
PFNDESTROYED m_pfnDestroy;
HWND m_hWndAdvise; //Popup with Advise menu
DWORD m_dwAdvFlags; //Notification flags
//Contained interface implemetation
PIMPIDATAOBJECT m_pIDataObject;
//Other interfaces used, implemented elsewhere
LPDATAADVISEHOLDER m_pIDataAdviseHolder;
//Arrays for IDataObject::EnumFormatEtc
#define CFORMATETCGET 1
ULONG m_cfeGet;
FORMATETC m_rgfeGet[CFORMATETCGET];
LPSTR m_dataText;
ULONG m_cDataSize;
protected:
//Functions for use from IDataObject::GetData
#define FL_MAKE_ITEM 0x01 // StgMedium item must be created.
#define FL_USE_ITEM 0x00 // StgMedium item is allocated, use that.
#define FL_PASS_PUNK 0x02 // put a pUnk in the StgMedium.
HRESULT RenderText(LPSTGMEDIUM, LPTSTR, DWORD flags);
HRESULT RenderBitmap(LPSTGMEDIUM);
HRESULT RenderMetafilePict(LPSTGMEDIUM);
public:
CDataObject(LPUNKNOWN, PFNDESTROYED);
~CDataObject(void);
BOOL FInit(void);
//Non-delegating object IUnknown
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
typedef CDataObject *PCDataObject;
/*
* Interface implementations for the CDataObject object.
*/
class CImpIDataObject : public IDataObject
{
private:
ULONG m_cRef;
PCDataObject m_pObj;
LPUNKNOWN m_pUnkOuter;
public:
CImpIDataObject(PCDataObject, LPUNKNOWN);
~CImpIDataObject(void);
//IUnknown members that delegate to m_pUnkOuter.
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IDataObject members
STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
STDMETHODIMP QueryGetData(LPFORMATETC);
STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC);
STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL);
STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *);
STDMETHODIMP DAdvise(LPFORMATETC, DWORD, LPADVISESINK
, DWORD *);
STDMETHODIMP DUnadvise(DWORD);
STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *);
};
/*
* IEnumFORMATETC object that is created from
* IDataObject::EnumFormatEtc. This object lives on its own.
*/
class CEnumFormatEtc : public IEnumFORMATETC
{
private:
ULONG m_cRef; //Object reference count
LPUNKNOWN m_pUnkRef; //For reference counting
ULONG m_iCur; //Current element.
ULONG m_cfe; //Number of FORMATETCs in us
LPFORMATETC m_prgfe; //Source of FORMATETCs
public:
CEnumFormatEtc(LPUNKNOWN, ULONG, LPFORMATETC);
~CEnumFormatEtc(void);
//IUnknown members that delegate to m_pUnkRef.
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IEnumFORMATETC members
STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG *);
STDMETHODIMP Skip(ULONG);
STDMETHODIMP Reset(void);
STDMETHODIMP Clone(IEnumFORMATETC **);
};
typedef CEnumFormatEtc *PCEnumFormatEtc;
//////////////////////////////////////////////////////////////////////////////
// Storage Medium IUnknown interface for pUnkForRelease.
//
class CStgMedIf: public IUnknown {
private:
ULONG m_cRef;
LPSTGMEDIUM m_pSTM;
public:
CStgMedIf(LPSTGMEDIUM);
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
//////////////////////////
// API for getting a pUnkForRelease.
//
HRESULT
GetStgMedpUnkForRelease(LPSTGMEDIUM pSTM, IUnknown **pp_unk);
#endif //_DATAOBJ_H_