ReactOS 0.4.15-dev-7928-g68a8619
clipboard.c
Go to the documentation of this file.
1/*
2 * Richedit clipboard handling
3 *
4 * Copyright (C) 2006 Kevin Koltzau
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define NONAMELESSUNION
22
23#include "editor.h"
24
26
27static UINT cfRTF = 0;
28
29typedef struct DataObjectImpl {
32
33 FORMATETC *fmtetc;
35
39
40typedef struct EnumFormatImpl {
43
44 FORMATETC *fmtetc;
46
49
50static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc);
51
53{
54 return CONTAINING_RECORD(iface, DataObjectImpl, IDataObject_iface);
55}
56
58{
59 return CONTAINING_RECORD(iface, EnumFormatImpl, IEnumFORMATETC_iface);
60}
61
63{
65 TRACE("%p %s\n", This, debugstr_guid(riid));
66
68 IEnumFORMATETC_AddRef(iface);
69 *ppvObj = &This->IEnumFORMATETC_iface;
70 return S_OK;
71 }
72 *ppvObj = NULL;
73 return E_NOINTERFACE;
74}
75
77{
80 TRACE("(%p) ref=%d\n", This, ref);
81 return ref;
82}
83
85{
88 TRACE("(%p) ref=%d\n", This, ref);
89
90 if(!ref) {
91 GlobalFree(This->fmtetc);
93 }
94
95 return ref;
96}
97
99 FORMATETC *rgelt, ULONG *pceltFetched)
100{
102 ULONG count = 0;
103 TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched);
104
105 if(!rgelt)
106 return E_INVALIDARG;
107
108 count = min(celt, This->fmtetc_cnt-This->cur);
109 if(count > 0) {
110 memcpy(rgelt, This->fmtetc+This->cur, count*sizeof(FORMATETC));
111 This->cur += count;
112 }
113 if(pceltFetched)
114 *pceltFetched = count;
115 return count == celt ? S_OK : S_FALSE;
116}
117
119{
121 ULONG count = 0;
122 TRACE("(%p)->(%d)\n", This, celt);
123
124 count = min(celt, This->fmtetc_cnt-This->cur);
125 This->cur += count;
126 return count == celt ? S_OK : S_FALSE;
127}
128
130{
132 TRACE("(%p)\n", This);
133
134 This->cur = 0;
135 return S_OK;
136}
137
139{
141 HRESULT hr;
142 TRACE("(%p)->(%p)\n", This, ppenum);
143
144 if(!ppenum)
145 return E_INVALIDARG;
146 hr = EnumFormatImpl_Create(This->fmtetc, This->fmtetc_cnt, ppenum);
147 if(SUCCEEDED(hr))
148 hr = IEnumFORMATETC_Skip(*ppenum, This->cur);
149 return hr;
150}
151
152static const IEnumFORMATETCVtbl VT_EnumFormatImpl = {
160};
161
162static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT fmtetc_cnt,
163 IEnumFORMATETC **formatetc)
164{
166 TRACE("\n");
167
168 ret = heap_alloc(sizeof(EnumFormatImpl));
169 ret->IEnumFORMATETC_iface.lpVtbl = &VT_EnumFormatImpl;
170 ret->ref = 1;
171 ret->cur = 0;
172 ret->fmtetc_cnt = fmtetc_cnt;
173 ret->fmtetc = GlobalAlloc(GMEM_ZEROINIT, fmtetc_cnt*sizeof(FORMATETC));
174 memcpy(ret->fmtetc, fmtetc, fmtetc_cnt*sizeof(FORMATETC));
175 *formatetc = &ret->IEnumFORMATETC_iface;
176 return S_OK;
177}
178
180{
182 TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
183
185 IDataObject_AddRef(iface);
186 *ppvObj = &This->IDataObject_iface;
187 return S_OK;
188 }
189 *ppvObj = NULL;
190 return E_NOINTERFACE;
191}
192
194{
197 TRACE("(%p) ref=%d\n", This, ref);
198 return ref;
199}
200
202{
205 TRACE("(%p) ref=%d\n",This, ref);
206
207 if(!ref) {
208 if(This->unicode) GlobalFree(This->unicode);
209 if(This->rtf) GlobalFree(This->rtf);
210 if(This->fmtetc) GlobalFree(This->fmtetc);
212 }
213
214 return ref;
215}
216
217static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
218{
220 TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed);
221
222 if(pformatetc->lindex != -1)
223 return DV_E_LINDEX;
224
225 if(!(pformatetc->tymed & TYMED_HGLOBAL))
226 return DV_E_TYMED;
227
228 if(This->unicode && pformatetc->cfFormat == CF_UNICODETEXT)
229 pmedium->u.hGlobal = This->unicode;
230 else if(This->rtf && pformatetc->cfFormat == cfRTF)
231 pmedium->u.hGlobal = This->rtf;
232 else
233 return DV_E_FORMATETC;
234
235 pmedium->tymed = TYMED_HGLOBAL;
236 pmedium->pUnkForRelease = (LPUNKNOWN)iface;
237 IUnknown_AddRef(pmedium->pUnkForRelease);
238 return S_OK;
239}
240
241static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
242{
244 FIXME("(%p): stub\n", This);
245 return E_NOTIMPL;
246}
247
248static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC *pformatetc)
249{
251 UINT i;
252 BOOL foundFormat = FALSE;
253 TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed);
254
255 if(pformatetc->lindex != -1)
256 return DV_E_LINDEX;
257
258 for(i=0; i<This->fmtetc_cnt; i++) {
259 if(This->fmtetc[i].cfFormat == pformatetc->cfFormat) {
260 foundFormat = TRUE;
261 if(This->fmtetc[i].tymed == pformatetc->tymed)
262 return S_OK;
263 }
264 }
265 return foundFormat?DV_E_FORMATETC:DV_E_TYMED;
266}
267
268static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject* iface, FORMATETC *pformatetcIn,
269 FORMATETC *pformatetcOut)
270{
272 TRACE("(%p)->(%p,%p)\n", This, pformatetcIn, pformatetcOut);
273
274 if(pformatetcOut) {
275 *pformatetcOut = *pformatetcIn;
276 pformatetcOut->ptd = NULL;
277 }
279}
280
281static HRESULT WINAPI DataObjectImpl_SetData(IDataObject* iface, FORMATETC *pformatetc,
282 STGMEDIUM *pmedium, BOOL fRelease)
283{
285 FIXME("(%p): stub\n", This);
286 return E_NOTIMPL;
287}
288
290 IEnumFORMATETC **ppenumFormatEtc)
291{
293 TRACE("(%p)->(%d)\n", This, dwDirection);
294
295 if(dwDirection != DATADIR_GET) {
296 FIXME("Unsupported direction: %d\n", dwDirection);
297 /* WinXP riched20 also returns E_NOTIMPL in this case */
298 *ppenumFormatEtc = NULL;
299 return E_NOTIMPL;
300 }
301 return EnumFormatImpl_Create(This->fmtetc, This->fmtetc_cnt, ppenumFormatEtc);
302}
303
304static HRESULT WINAPI DataObjectImpl_DAdvise(IDataObject* iface, FORMATETC *pformatetc, DWORD advf,
305 IAdviseSink *pAdvSink, DWORD *pdwConnection)
306{
308 FIXME("(%p): stub\n", This);
309 return E_NOTIMPL;
310}
311
313{
315 FIXME("(%p): stub\n", This);
316 return E_NOTIMPL;
317}
318
320{
322 FIXME("(%p): stub\n", This);
323 return E_NOTIMPL;
324}
325
326static const IDataObjectVtbl VT_DataObjectImpl =
327{
340};
341
342static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
343{
344 int pars = 0;
345 WCHAR *data;
346 HANDLE ret;
347 ME_DisplayItem *para;
348 int nEnd = ME_GetCursorOfs(start) + nChars;
349
350 /* count paragraphs in range */
351 para = start->pPara;
352 while((para = para->member.para.next_para) &&
353 para->member.para.nCharOfs <= nEnd)
354 pars++;
355
356 ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1));
358 ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE, FALSE);
360 return ret;
361}
362
364{
368
370{
372 int nMaxSize;
373 BYTE *pDest;
374
375 nMaxSize = GlobalSize(pData->hData);
376 if (pData->nLength+cb+1 >= cb) {
377 /* round up to 2^17 */
378 int nNewSize = (((nMaxSize+cb+1)|0x1FFFF)+1) & 0xFFFE0000;
379 pData->hData = GlobalReAlloc(pData->hData, nNewSize, 0);
380 }
381 pDest = GlobalLock(pData->hData);
382 memcpy(pDest + pData->nLength, lpBuff, cb);
383 pData->nLength += cb;
384 pDest[pData->nLength] = '\0';
385 GlobalUnlock(pData->hData);
386 *pcb = cb;
387
388 return 0;
389}
390
391static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
392{
395
397 gds.nLength = 0;
398 es.dwCookie = (DWORD_PTR)&gds;
399 es.pfnCallback = ME_AppendToHGLOBAL;
400 ME_StreamOutRange(editor, SF_RTF, start, nChars, &es);
401 GlobalReAlloc(gds.hData, gds.nLength+1, 0);
402 return gds.hData;
403}
404
406 IDataObject **dataobj)
407{
409 TRACE("(%p,%d,%d)\n", editor, ME_GetCursorOfs(start), nChars);
410
411 obj = heap_alloc(sizeof(DataObjectImpl));
412 if(cfRTF == 0)
413 cfRTF = RegisterClipboardFormatA("Rich Text Format");
414
416 obj->ref = 1;
417 obj->unicode = get_unicode_text(editor, start, nChars);
418 obj->rtf = NULL;
419
420 obj->fmtetc_cnt = 1;
421 if(editor->mode & TM_RICHTEXT)
422 obj->fmtetc_cnt++;
423 obj->fmtetc = GlobalAlloc(GMEM_ZEROINIT, obj->fmtetc_cnt*sizeof(FORMATETC));
424 InitFormatEtc(obj->fmtetc[0], CF_UNICODETEXT, TYMED_HGLOBAL);
425 if(editor->mode & TM_RICHTEXT) {
426 obj->rtf = get_rtf_text(editor, start, nChars);
427 InitFormatEtc(obj->fmtetc[1], cfRTF, TYMED_HGLOBAL);
428 }
429
430 *dataobj = &obj->IDataObject_iface;
431 return S_OK;
432}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define CF_UNICODETEXT
Definition: constants.h:408
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CALLBACK
Definition: compat.h:35
static snapshot * impl_from_IDataObject(IDataObject *iface)
Definition: clipboard.c:159
static enum_fmtetc * impl_from_IEnumFORMATETC(IEnumFORMATETC *iface)
Definition: clipboard.c:238
int ME_GetCursorOfs(const ME_Cursor *cursor)
Definition: caret.c:957
struct EnumFormatImpl EnumFormatImpl
static ULONG WINAPI EnumFormatImpl_AddRef(IEnumFORMATETC *iface)
Definition: clipboard.c:76
static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
Definition: clipboard.c:241
static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
Definition: clipboard.c:342
static ULONG WINAPI DataObjectImpl_AddRef(IDataObject *iface)
Definition: clipboard.c:193
static HRESULT WINAPI EnumFormatImpl_Skip(IEnumFORMATETC *iface, ULONG celt)
Definition: clipboard.c:118
static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
Definition: clipboard.c:391
static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc)
static ULONG WINAPI EnumFormatImpl_Release(IEnumFORMATETC *iface)
Definition: clipboard.c:84
static const IDataObjectVtbl VT_DataObjectImpl
Definition: clipboard.c:326
static UINT cfRTF
Definition: clipboard.c:27
static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject *iface, FORMATETC *pformatetc)
Definition: clipboard.c:248
static HRESULT WINAPI EnumFormatImpl_Next(IEnumFORMATETC *iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched)
Definition: clipboard.c:98
static DWORD CALLBACK ME_AppendToHGLOBAL(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
Definition: clipboard.c:369
static HRESULT WINAPI DataObjectImpl_DAdvise(IDataObject *iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
Definition: clipboard.c:304
static HRESULT WINAPI DataObjectImpl_QueryInterface(IDataObject *iface, REFIID riid, LPVOID *ppvObj)
Definition: clipboard.c:179
static HRESULT WINAPI DataObjectImpl_DUnadvise(IDataObject *iface, DWORD dwConnection)
Definition: clipboard.c:312
static HRESULT WINAPI DataObjectImpl_EnumFormatEtc(IDataObject *iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
Definition: clipboard.c:289
static ULONG WINAPI DataObjectImpl_Release(IDataObject *iface)
Definition: clipboard.c:201
static HRESULT WINAPI DataObjectImpl_GetData(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
Definition: clipboard.c:217
static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject *iface, FORMATETC *pformatetcIn, FORMATETC *pformatetcOut)
Definition: clipboard.c:268
struct tagME_GlobalDestStruct ME_GlobalDestStruct
static HRESULT WINAPI EnumFormatImpl_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum)
Definition: clipboard.c:138
static HRESULT WINAPI DataObjectImpl_EnumDAdvise(IDataObject *iface, IEnumSTATDATA **ppenumAdvise)
Definition: clipboard.c:319
static HRESULT WINAPI EnumFormatImpl_QueryInterface(IEnumFORMATETC *iface, REFIID riid, LPVOID *ppvObj)
Definition: clipboard.c:62
HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, IDataObject **dataobj)
Definition: clipboard.c:405
static HRESULT WINAPI DataObjectImpl_SetData(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: clipboard.c:281
static HRESULT WINAPI EnumFormatImpl_Reset(IEnumFORMATETC *iface)
Definition: clipboard.c:129
struct DataObjectImpl DataObjectImpl
static const IEnumFORMATETCVtbl VT_EnumFormatImpl
Definition: clipboard.c:152
int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, const ME_Cursor *start, int srcChars, BOOL bCRLF, BOOL bEOP)
Definition: editor.c:5192
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream) DECLSPEC_HIDDEN
Definition: writer.c:1163
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
HGLOBAL NTAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:825
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
#define es
Definition: i386-dis.c:440
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
static LPUNKNOWN
Definition: ndr_ole.c:49
interface IEnumFORMATETC * LPENUMFORMATETC
Definition: objfwd.h:24
const GUID IID_IEnumFORMATETC
const GUID IID_IDataObject
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define TM_RICHTEXT
Definition: richedit.h:1029
#define SF_RTF
Definition: richedit.h:721
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
HANDLE rtf
Definition: clipboard.c:37
HANDLE unicode
Definition: clipboard.c:36
FORMATETC * fmtetc
Definition: clipboard.c:33
IDataObject IDataObject_iface
Definition: clipboard.c:30
UINT fmtetc_cnt
Definition: clipboard.c:34
IEnumFORMATETC IEnumFORMATETC_iface
Definition: clipboard.c:41
FORMATETC * fmtetc
Definition: clipboard.c:44
UINT fmtetc_cnt
Definition: clipboard.c:45
IDataObject IDataObject_iface
Definition: usrmarshal.c:1273
Definition: send.c:48
union tagME_DisplayItem::@536 member
ME_Paragraph para
Definition: editstr.h:262
struct tagME_DisplayItem * next_para
Definition: editstr.h:217
#define DWORD_PTR
Definition: treelist.c:76
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
int ret
#define GMEM_ZEROINIT
Definition: winbase.h:306
#define GMEM_MOVEABLE
Definition: winbase.h:294
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define DV_E_TYMED
Definition: winerror.h:2638
#define DV_E_FORMATETC
Definition: winerror.h:2633
#define DV_E_LINDEX
Definition: winerror.h:2637
#define DATA_S_SAMEFORMATETC
Definition: winerror.h:2674
UINT WINAPI RegisterClipboardFormatA(_In_ LPCSTR)
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193