1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: clipdata.h
//
// Contents: Declaration of the clipboard data object.
//
// Classes: CClipDataObject
//
// Functions:
//
// History: dd-mmm-yy Author Comment
// 01-Feb-95 t-ScottH added Dump methods to CClipDataObject
// and CClipEnumFormatEtc
// 31-Mar-94 alexgo author
//
//--------------------------------------------------------------------------
#ifdef _DEBUG
#include <dbgexts.h>
#endif // _DEBUG
#ifndef _CLIPDATA_H
#define _CLIPDATA_H
typedef enum
{
RESET_AND_FREE = 1,
JUST_RESET = 2
} FreeResourcesFlags;
typedef enum
{
FORMAT_NOTFOUND = 1,
FORMAT_BADMATCH = 2,
FORMAT_GOODMATCH = 4
} FormatMatchFlag;
//+-------------------------------------------------------------------------
//
// Class: CClipDataObject
//
// Purpose: clipboard data object
//
// Interface: IDataObject
//
// History: dd-mmm-yy Author Comment
// 01-Feb-95 t-ScottH added Dump method (_DEBUG only)
// 04-Jun-94 alexgo added OLE1 support
// 31-Mar-94 alexgo author
//
// Notes: See clipdata.cpp for a description of OLE1 support
//
//--------------------------------------------------------------------------
class CClipDataObject : public IDataObject, public CPrivAlloc,
public CThreadCheck
{
public:
// IUnknown methods
STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (void);
STDMETHOD_(ULONG,Release) (void);
// IDataObject methods
STDMETHOD(GetData) (LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium);
STDMETHOD(GetDataHere) (LPFORMATETC pformatetc,
LPSTGMEDIUM pmedium);
STDMETHOD(QueryGetData) (LPFORMATETC pformatetc);
STDMETHOD(GetCanonicalFormatEtc) (LPFORMATETC pformatetc,
LPFORMATETC pformatetcOut);
STDMETHOD(SetData) (LPFORMATETC pformatetc,
STGMEDIUM FAR* pmedium, BOOL fRelease);
STDMETHOD(EnumFormatEtc) (DWORD dwDirection,
LPENUMFORMATETC FAR* ppenumFormatEtc);
STDMETHOD(DAdvise) (FORMATETC FAR* pFormatetc, DWORD advf,
IAdviseSink FAR* pAdvSink, DWORD FAR* pdwConnection);
STDMETHOD(DUnadvise) (DWORD dwConnection);
STDMETHOD(EnumDAdvise) (LPENUMSTATDATA FAR* ppenumAdvise);
static HRESULT CClipDataObject::Create(IDataObject **ppDataObj,
FORMATETC *prgFormats, DWORD cFormats);
#ifdef _DEBUG
HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel);
// need to be able to access CClipDataObject private data members in the
// following debugger extension APIs
// this allows the debugger extension APIs to copy memory from the
// debuggee process memory to the debugger's process memory
// this is required since the Dump method follows pointers to other
// structures and classes
friend DEBUG_EXTENSION_API(dump_clipdataobject);
#endif // _DEBUG
// HACK ALERT!!! The constructor and destructor for the clipboard
// data object should really be private. However, MFC was being
// slimy, so we have to special case testing against clipboard data
// objects in OleQueryCreateFromData. See create.cpp,
// wQueryEmbedFormats for more details.
CClipDataObject(); // constructor
~CClipDataObject(); // destructor
private:
void GetDataObjectForClip(); // Get real data object for clipboard
FormatMatchFlag MatchFormatetc( FORMATETC *pformatetc, TYMED *ptymed );
// checks the given formatetc against
// the formatetc we know about.
// the following methods and data items are used for OLE1
// support
void FreeResources( FreeResourcesFlags fFlags );
HRESULT GetAndTranslateOle1( UINT cf, LPOLESTR *ppszClass,
LPOLESTR *ppszFile, LPOLESTR *ppszItem,
LPSTR *ppszItemA );
HRESULT GetEmbeddedObjectFromOle1( STGMEDIUM *pmedium );
HRESULT GetEmbedSourceFromOle1( STGMEDIUM *pmedium );
HRESULT GetLinkSourceFromOle1( STGMEDIUM *pmedium );
HRESULT GetObjectDescriptorFromOle1( UINT cf,
STGMEDIUM *pmedium );
HRESULT GetOle2FromOle1( UINT cf, STGMEDIUM *pmedium );
HRESULT OleGetClipboardData( UINT cf, HANDLE *pHandle );
BOOL OleIsClipboardFormatAvailable( UINT cf );
HGLOBAL m_hOle1; // hGlobal to OLE2 data constructed
// from OLE1 data
IUnknown * m_pUnkOle1; // IUnknown to either a storage or
// a stream of OLE1 data
// end of OLE1 support
ULONG m_refs; // reference count
FORMATETC * m_rgFormats;// array of formatetcs (if available)
DWORD m_cFormats; // count of the formats
IDataObject * m_pDataObject; // Actual data object for data.
BOOL m_fTriedToGetDataObject;
// indicates whether or not we've
// tried to get the real IDataObject
// from the clipboard source
// (see GetDataObjectForClip)
};
//+-------------------------------------------------------------------------
//
// Class: CClipEnumFormatEtc
//
// Purpose: Enumerator for the formats available on the clipboard
//
// Interface: IEnumFORMATETC
//
// History: dd-mmm-yy Author Comment
// 01-Feb-95 t-ScottH added Dump method (_DEBUG only)
// 05-Apr-94 alexgo author
//
// Notes:
//
//--------------------------------------------------------------------------
class CClipEnumFormatEtc :public IEnumFORMATETC, public CPrivAlloc,
public CThreadCheck
{
public:
STDMETHOD(QueryInterface)(REFIID riid, LPLPVOID ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
STDMETHOD(Next) (ULONG celt, FORMATETC *rgelt,
ULONG *pceltFetched);
STDMETHOD(Skip) (ULONG celt);
STDMETHOD(Reset) (void);
STDMETHOD(Clone) (IEnumFORMATETC **ppenum);
static HRESULT Create(IEnumFORMATETC **ppIEnum, FORMATETC *prgFormats,
DWORD cFormats);
#ifdef _DEBUG
HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel);
// need to be able to access CClipEnumFormatEtc private data members in the
// following debugger extension APIs
// this allows the debugger extension APIs to copy memory from the
// debuggee process memory to the debugger's process memory
// this is required since the Dump method follows pointers to other
// structures and classes
friend DEBUG_EXTENSION_API(dump_clipenumformatetc);
#endif // _DEBUG
private:
CClipEnumFormatEtc(); // constructor
~CClipEnumFormatEtc(); // destructor
ULONG m_refs; // reference count
ULONG m_iCurrent; // current clipboard format
ULONG m_cTotal; // total number of formats
FORMATETC * m_rgFormats; // array of available formats
};
#endif // !_CLIPDATA_H
|