ReactOS 0.4.17-dev-577-ge3e58ac
recinfo.c
Go to the documentation of this file.
1/*
2 * Copyright 2005 Jacek Caban
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include <stdarg.h>
20
21#define COBJMACROS
22#include "windef.h"
23#include "winbase.h"
24#include "objbase.h"
25#include "oaidl.h"
26#include "oleauto.h"
27#include "variant.h"
28
29#include "wine/debug.h"
30
32
33typedef struct {
34 enum VARENUM vt;
35 VARKIND varkind;
38} fieldstr;
39
40typedef struct {
43
52
54{
55 return CONTAINING_RECORD(iface, IRecordInfoImpl, IRecordInfo_iface);
56}
57
58static HRESULT copy_to_variant(void *src, VARIANT *pvar, enum VARENUM vt)
59{
60 TRACE("%p %p %d\n", src, pvar, vt);
61
62#define CASE_COPY(x) \
63 case VT_ ## x: \
64 memcpy(&V_ ## x(pvar), src, sizeof(V_ ## x(pvar))); \
65 break
66
67 switch(vt) {
68 CASE_COPY(I2);
69 CASE_COPY(I4);
78 CASE_COPY(I1);
79 CASE_COPY(UI1);
80 CASE_COPY(UI2);
81 CASE_COPY(UI4);
82 CASE_COPY(I8);
83 CASE_COPY(UI8);
88 default:
89 FIXME("Not supported type: %d\n", vt);
90 return E_NOTIMPL;
91 };
92#undef CASE_COPY
93
94 V_VT(pvar) = vt;
95 return S_OK;
96}
97
99{
100 VARIANT var;
102
103 TRACE("(%p(%d) %p %d)\n", src, V_VT(src), dest, vt);
104
106 if(FAILED(hres))
107 return hres;
108
109#define CASE_COPY(x) \
110 case VT_ ## x: \
111 memcpy(dest, &V_ ## x(&var), sizeof(V_ ## x(&var))); \
112 break
113
114 switch(vt) {
115 CASE_COPY(I2);
116 CASE_COPY(I4);
117 CASE_COPY(R4);
118 CASE_COPY(R8);
119 CASE_COPY(CY);
125 CASE_COPY(I1);
126 CASE_COPY(UI1);
127 CASE_COPY(UI2);
128 CASE_COPY(UI4);
129 CASE_COPY(I8);
130 CASE_COPY(UI8);
131 CASE_COPY(INT);
135 default:
136 FIXME("Not supported type: %d\n", V_VT(&var));
137 return E_NOTIMPL;
138 };
139#undef CASE_COPY
140 return S_OK;
141}
142
144 void **ppvObject)
145{
146 TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppvObject);
147
148 *ppvObject = NULL;
149
150 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IRecordInfo, riid)) {
151 *ppvObject = iface;
152 IRecordInfo_AddRef(iface);
153 return S_OK;
154 }
155
156 FIXME("Not supported interface: %s\n", debugstr_guid(riid));
157 return E_NOINTERFACE;
158}
159
161{
164 TRACE("%p, refcount %lu.\n", iface, ref);
165 return ref;
166}
167
169{
172
173 TRACE("%p, refcount %lu.\n", iface, ref);
174
175 if(!ref) {
176 int i;
177 for(i=0; i<This->n_vars; i++)
178 SysFreeString(This->fields[i].name);
179 SysFreeString(This->name);
180 free(This->fields);
181 ITypeInfo_Release(This->pTypeInfo);
182 free(This);
183 }
184 return ref;
185}
186
188{
190 TRACE("(%p)->(%p)\n", This, pvNew);
191
192 if(!pvNew)
193 return E_INVALIDARG;
194
195 memset(pvNew, 0, This->size);
196 return S_OK;
197}
198
200{
202 int i;
203 PVOID var;
204
205 TRACE("(%p)->(%p)\n", This, pvExisting);
206
207 if(!pvExisting)
208 return E_INVALIDARG;
209
210 for(i=0; i<This->n_vars; i++) {
211 if(This->fields[i].varkind != VAR_PERINSTANCE) {
212 ERR("varkind != VAR_PERINSTANCE\n");
213 continue;
214 }
215 var = ((PBYTE)pvExisting)+This->fields[i].offset;
216 switch(This->fields[i].vt) {
217 case VT_BSTR:
219 *(BSTR*)var = NULL;
220 break;
221 case VT_I2:
222 case VT_I4:
223 case VT_R4:
224 case VT_R8:
225 case VT_CY:
226 case VT_DATE:
227 case VT_ERROR:
228 case VT_BOOL:
229 case VT_DECIMAL:
230 case VT_I1:
231 case VT_UI1:
232 case VT_UI2:
233 case VT_UI4:
234 case VT_I8:
235 case VT_UI8:
236 case VT_INT:
237 case VT_UINT:
238 case VT_HRESULT:
239 break;
240 case VT_INT_PTR:
241 case VT_UINT_PTR:
242 *(void**)var = NULL;
243 break;
244 case VT_SAFEARRAY:
246 break;
247 case VT_UNKNOWN:
248 case VT_DISPATCH:
249 {
250 IUnknown *unk = *(IUnknown**)var;
251 if (unk)
252 IUnknown_Release(unk);
253 *(void**)var = NULL;
254 break;
255 }
256 default:
257 FIXME("Not supported vt = %d\n", This->fields[i].vt);
258 break;
259 }
260 }
261
262 return S_OK;
263}
264
265static HRESULT WINAPI IRecordInfoImpl_RecordCopy(IRecordInfo *iface, void *src_rec, void *dest_rec)
266{
268 HRESULT hr = S_OK;
269 int i;
270
271 TRACE("(%p)->(%p %p)\n", This, src_rec, dest_rec);
272
273 if(!src_rec || !dest_rec)
274 return E_INVALIDARG;
275
276 /* release already stored data */
277 IRecordInfo_RecordClear(iface, dest_rec);
278
279 for (i = 0; i < This->n_vars; i++)
280 {
281 void *src, *dest;
282
283 if (This->fields[i].varkind != VAR_PERINSTANCE) {
284 ERR("varkind != VAR_PERINSTANCE\n");
285 continue;
286 }
287
288 src = ((BYTE*)src_rec) + This->fields[i].offset;
289 dest = ((BYTE*)dest_rec) + This->fields[i].offset;
290 switch (This->fields[i].vt)
291 {
292 case VT_BSTR:
293 {
294 BSTR src_str = *(BSTR*)src;
295
296 if (src_str)
297 {
299 if (!str) hr = E_OUTOFMEMORY;
300
301 *(BSTR*)dest = str;
302 }
303 else
304 *(BSTR*)dest = NULL;
305 break;
306 }
307 case VT_UNKNOWN:
308 case VT_DISPATCH:
309 {
310 IUnknown *unk = *(IUnknown**)src;
311 *(IUnknown**)dest = unk;
312 if (unk) IUnknown_AddRef(unk);
313 break;
314 }
315 case VT_SAFEARRAY:
317 break;
318 default:
319 {
320 /* copy directly for types that don't need deep copy */
321 int len = get_type_size(NULL, This->fields[i].vt);
322 memcpy(dest, src, len);
323 break;
324 }
325 }
326
327 if (FAILED(hr)) break;
328 }
329
330 if (FAILED(hr))
331 IRecordInfo_RecordClear(iface, dest_rec);
332
333 return hr;
334}
335
337{
339
340 TRACE("(%p)->(%p)\n", This, pguid);
341
342 if(!pguid)
343 return E_INVALIDARG;
344
345 *pguid = This->guid;
346 return S_OK;
347}
348
350{
352
353 TRACE("(%p)->(%p)\n", This, pbstrName);
354
355 if(!pbstrName)
356 return E_INVALIDARG;
357
358 *pbstrName = SysAllocString(This->name);
359 return S_OK;
360}
361
363{
365
366 TRACE("(%p)->(%p)\n", This, pcbSize);
367
368 if(!pcbSize)
369 return E_INVALIDARG;
370
371 *pcbSize = This->size;
372 return S_OK;
373}
374
376{
378
379 TRACE("(%p)->(%p)\n", This, ppTypeInfo);
380
381 if(!ppTypeInfo)
382 return E_INVALIDARG;
383
384 ITypeInfo_AddRef(This->pTypeInfo);
385 *ppTypeInfo = This->pTypeInfo;
386
387 return S_OK;
388}
389
391 LPCOLESTR szFieldName, VARIANT *pvarField)
392{
394 int i;
395
396 TRACE("(%p)->(%p %s %p)\n", This, pvData, debugstr_w(szFieldName), pvarField);
397
398 if(!pvData || !szFieldName || !pvarField)
399 return E_INVALIDARG;
400
401 for(i=0; i<This->n_vars; i++)
402 if(!wcscmp(This->fields[i].name, szFieldName))
403 break;
404 if(i == This->n_vars)
406
407 VariantClear(pvarField);
408 return copy_to_variant(((PBYTE)pvData)+This->fields[i].offset, pvarField,
409 This->fields[i].vt);
410}
411
413 LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
414{
416 int i;
417
418 TRACE("(%p)->(%p %s %p %p)\n", This, pvData, debugstr_w(szFieldName), pvarField, ppvDataCArray);
419
420 if(!pvData || !szFieldName || !pvarField)
421 return E_INVALIDARG;
422
423 for(i=0; i<This->n_vars; i++)
424 if(!wcscmp(This->fields[i].name, szFieldName))
425 break;
426 if(i == This->n_vars)
428
429 VariantClear(pvarField);
430 V_VT(pvarField) = VT_BYREF|This->fields[i].vt;
431 V_BYREF(pvarField) = ((PBYTE)pvData)+This->fields[i].offset;
432 *ppvDataCArray = NULL;
433 return S_OK;
434}
435
437 LPCOLESTR szFieldName, VARIANT *pvarField)
438{
440 int i;
441
442 TRACE("%p, %#lx, %p, %s, %p.\n", iface, wFlags, pvData, debugstr_w(szFieldName), pvarField);
443
444 if(!pvData || !szFieldName || !pvarField
445 || (wFlags != INVOKE_PROPERTYPUTREF && wFlags != INVOKE_PROPERTYPUT))
446 return E_INVALIDARG;
447
448 if(wFlags == INVOKE_PROPERTYPUTREF) {
449 FIXME("wFlag == INVOKE_PROPERTYPUTREF not supported\n");
450 return E_NOTIMPL;
451 }
452
453 for(i=0; i<This->n_vars; i++)
454 if(!wcscmp(This->fields[i].name, szFieldName))
455 break;
456 if(i == This->n_vars)
458
459 return copy_from_variant(pvarField, ((PBYTE)pvData)+This->fields[i].offset,
460 This->fields[i].vt);
461}
462
464 PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
465{
467 int i;
468
469 FIXME("%p, %#lx, %p, %s, %p stub\n", iface, wFlags, pvData, debugstr_w(szFieldName), pvarField);
470
471 if(!pvData || !szFieldName || !pvarField
472 || (wFlags != INVOKE_PROPERTYPUTREF && wFlags != INVOKE_PROPERTYPUT))
473 return E_INVALIDARG;
474
475 for(i=0; i<This->n_vars; i++)
476 if(!wcscmp(This->fields[i].name, szFieldName))
477 break;
478 if(i == This->n_vars)
480
481 return E_NOTIMPL;
482}
483
485 BSTR *rgBstrNames)
486{
488 ULONG n = This->n_vars, i;
489
490 TRACE("(%p)->(%p %p)\n", This, pcNames, rgBstrNames);
491
492 if(!pcNames)
493 return E_INVALIDARG;
494
495 if(*pcNames < n)
496 n = *pcNames;
497
498 if(rgBstrNames) {
499 for(i=0; i<n; i++)
500 rgBstrNames[i] = SysAllocString(This->fields[i].name);
501 }
502
503 *pcNames = n;
504 return S_OK;
505}
506
508{
510 GUID guid2;
511
512 TRACE( "(%p)->(%p)\n", This, info2 );
513
514 IRecordInfo_GetGuid( info2, &guid2 );
515 return IsEqualGUID( &This->guid, &guid2 );
516}
517
519{
521 void *record;
522
523 TRACE("(%p)\n", This);
524
525 record = CoTaskMemAlloc(This->size);
526 IRecordInfo_RecordInit(iface, record);
527 TRACE("created record at %p\n", record);
528 return record;
529}
530
532 PVOID *ppvDest)
533{
535
536 TRACE("(%p)->(%p %p)\n", This, pvSource, ppvDest);
537
538 if(!pvSource || !ppvDest)
539 return E_INVALIDARG;
540
541 *ppvDest = IRecordInfo_RecordCreate(iface);
542 return IRecordInfo_RecordCopy(iface, pvSource, *ppvDest);
543}
544
546{
549
550 TRACE("(%p)->(%p)\n", This, pvRecord);
551
552 hres = IRecordInfo_RecordClear(iface, pvRecord);
553 if(FAILED(hres))
554 return hres;
555
556 CoTaskMemFree(pvRecord);
557 return S_OK;
558}
559
560static const IRecordInfoVtbl IRecordInfoImplVtbl = {
580};
581
582/******************************************************************************
583 * GetRecordInfoFromGuids [OLEAUT32.322]
584 *
585 * RETURNS
586 * Success: S_OK
587 * Failure: E_INVALIDARG, if any argument is invalid.
588 */
590 ULONG uVerMinor, LCID lcid, REFGUID rGuidTypeInfo, IRecordInfo** ppRecInfo)
591{
592 ITypeInfo *pTypeInfo;
593 ITypeLib *pTypeLib;
595
596 TRACE("%s, %lu, %lu, %#lx, %s, %p.\n", debugstr_guid(rGuidTypeLib), uVerMajor, uVerMinor,
597 lcid, debugstr_guid(rGuidTypeInfo), ppRecInfo);
598
599 hres = LoadRegTypeLib(rGuidTypeLib, uVerMajor, uVerMinor, lcid, &pTypeLib);
600 if(FAILED(hres)) {
601 WARN("LoadRegTypeLib failed!\n");
602 return hres;
603 }
604
605 hres = ITypeLib_GetTypeInfoOfGuid(pTypeLib, rGuidTypeInfo, &pTypeInfo);
606 ITypeLib_Release(pTypeLib);
607 if(FAILED(hres)) {
608 WARN("GetTypeInfoOfGuid failed!\n");
609 return hres;
610 }
611
612 hres = GetRecordInfoFromTypeInfo(pTypeInfo, ppRecInfo);
613 ITypeInfo_Release(pTypeInfo);
614 return hres;
615}
616
617/******************************************************************************
618 * GetRecordInfoFromTypeInfo [OLEAUT32.332]
619 */
622 TYPEATTR *typeattr;
624 ITypeInfo *pTypeInfo;
625 int i;
626 GUID guid;
627
628 TRACE("(%p %p)\n", pTI, ppRecInfo);
629
630 if(!pTI || !ppRecInfo)
631 return E_INVALIDARG;
632
633 hres = ITypeInfo_GetTypeAttr(pTI, &typeattr);
634 if(FAILED(hres) || !typeattr) {
635 WARN("GetTypeAttr failed: %#lx.\n", hres);
636 return hres;
637 }
638
639 if(typeattr->typekind == TKIND_ALIAS) {
640 hres = ITypeInfo_GetRefTypeInfo(pTI, typeattr->tdescAlias.hreftype, &pTypeInfo);
641 guid = typeattr->guid;
642 ITypeInfo_ReleaseTypeAttr(pTI, typeattr);
643 if(FAILED(hres)) {
644 WARN("GetRefTypeInfo failed: %#lx.\n", hres);
645 return hres;
646 }
647 hres = ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr);
648 if(FAILED(hres)) {
649 ITypeInfo_Release(pTypeInfo);
650 WARN("GetTypeAttr failed for referenced type: %#lx.\n", hres);
651 return hres;
652 }
653 }else {
654 pTypeInfo = pTI;
655 ITypeInfo_AddRef(pTypeInfo);
656 guid = typeattr->guid;
657 }
658
659 if(typeattr->typekind != TKIND_RECORD) {
660 WARN("typekind != TKIND_RECORD\n");
661 ITypeInfo_ReleaseTypeAttr(pTypeInfo, typeattr);
662 ITypeInfo_Release(pTypeInfo);
663 return E_INVALIDARG;
664 }
665
666 ret = calloc(1, sizeof(*ret));
667 ret->IRecordInfo_iface.lpVtbl = &IRecordInfoImplVtbl;
668 ret->ref = 1;
669 ret->pTypeInfo = pTypeInfo;
670 ret->n_vars = typeattr->cVars;
671 ret->size = typeattr->cbSizeInstance;
672 ITypeInfo_ReleaseTypeAttr(pTypeInfo, typeattr);
673
674 ret->guid = guid;
675
676 /* NOTE: Windows implementation calls ITypeInfo::GetCantainingTypeLib and
677 * ITypeLib::GetLibAttr, but we currently don't need this.
678 */
679
680 hres = ITypeInfo_GetDocumentation(pTypeInfo, MEMBERID_NIL, &ret->name, NULL, NULL, NULL);
681 if(FAILED(hres)) {
682 WARN("ITypeInfo::GetDocumentation failed\n");
683 ret->name = NULL;
684 }
685
686 ret->fields = calloc(ret->n_vars, sizeof(fieldstr));
687 for(i = 0; i<ret->n_vars; i++) {
688 VARDESC *vardesc;
689 hres = ITypeInfo_GetVarDesc(pTypeInfo, i, &vardesc);
690 if(FAILED(hres)) {
691 WARN("GetVarDesc failed\n");
692 continue;
693 }
694 ret->fields[i].vt = vardesc->elemdescVar.tdesc.vt;
695 ret->fields[i].varkind = vardesc->varkind;
696 ret->fields[i].offset = vardesc->oInst;
697 hres = ITypeInfo_GetDocumentation(pTypeInfo, vardesc->memid, &ret->fields[i].name,
698 NULL, NULL, NULL);
699 if(FAILED(hres))
700 WARN("GetDocumentation failed: %#lx.\n", hres);
701 TRACE("field=%s, offset=%ld\n", debugstr_w(ret->fields[i].name), ret->fields[i].offset);
702 ITypeInfo_ReleaseVarDesc(pTypeInfo, vardesc);
703 }
704
705 *ppRecInfo = &ret->IRecordInfo_iface;
706
707 return S_OK;
708}
@ R8
Definition: amd64_sup.c:13
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
double DATE
Definition: compat.h:2253
OLECHAR * BSTR
Definition: compat.h:2293
VARENUM
Definition: compat.h:2294
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_UINT_PTR
Definition: compat.h:2328
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_UI2
Definition: compat.h:2312
@ VT_DECIMAL
Definition: compat.h:2309
@ VT_ERROR
Definition: compat.h:2305
@ VT_SAFEARRAY
Definition: compat.h:2321
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_HRESULT
Definition: compat.h:2319
@ VT_INT_PTR
Definition: compat.h:2327
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
LCID lcid
Definition: locale.c:5660
GUID guid
Definition: version.c:147
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
HRESULT WINAPI LoadRegTypeLib(REFGUID rguid, WORD wVerMajor, WORD wVerMinor, LCID lcid, ITypeLib **ppTLib)
Definition: typelib.c:507
unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
Definition: usrmarshal.c:207
return ret
Definition: mutex.c:146
#define ERROR(name)
Definition: error_private.h:53
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
GLdouble n
Definition: glext.h:7729
GLenum src
Definition: glext.h:6340
GLenum GLsizei len
Definition: glext.h:6722
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
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const char * var
Definition: shader.c:5666
HRESULT hres
Definition: protocol.c:465
static char * dest
Definition: rtl.c:149
static GUID guid2
Definition: devinst.c:42
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
#define MEMBERID_NIL
Definition: oleauto.h:1003
#define V_VT(A)
Definition: oleauto.h:211
#define V_BYREF(A)
Definition: oleauto.h:228
BYTE * PBYTE
Definition: pedump.c:66
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static HRESULT copy_from_variant(VARIANT *src, void *dest, enum VARENUM vt)
Definition: recinfo.c:98
static HRESULT WINAPI IRecordInfoImpl_QueryInterface(IRecordInfo *iface, REFIID riid, void **ppvObject)
Definition: recinfo.c:143
static HRESULT WINAPI IRecordInfoImpl_GetName(IRecordInfo *iface, BSTR *pbstrName)
Definition: recinfo.c:349
static HRESULT WINAPI IRecordInfoImpl_GetTypeInfo(IRecordInfo *iface, ITypeInfo **ppTypeInfo)
Definition: recinfo.c:375
static HRESULT WINAPI IRecordInfoImpl_GetFieldNoCopy(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
Definition: recinfo.c:412
static const IRecordInfoVtbl IRecordInfoImplVtbl
Definition: recinfo.c:560
static HRESULT WINAPI IRecordInfoImpl_RecordCopy(IRecordInfo *iface, void *src_rec, void *dest_rec)
Definition: recinfo.c:265
static IRecordInfoImpl * impl_from_IRecordInfo(IRecordInfo *iface)
Definition: recinfo.c:53
static HRESULT WINAPI IRecordInfoImpl_PutField(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:436
static HRESULT copy_to_variant(void *src, VARIANT *pvar, enum VARENUM vt)
Definition: recinfo.c:58
static HRESULT WINAPI IRecordInfoImpl_GetSize(IRecordInfo *iface, ULONG *pcbSize)
Definition: recinfo.c:362
#define CASE_COPY(x)
static HRESULT WINAPI IRecordInfoImpl_GetFieldNames(IRecordInfo *iface, ULONG *pcNames, BSTR *rgBstrNames)
Definition: recinfo.c:484
static ULONG WINAPI IRecordInfoImpl_AddRef(IRecordInfo *iface)
Definition: recinfo.c:160
static HRESULT WINAPI IRecordInfoImpl_GetField(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:390
static HRESULT WINAPI IRecordInfoImpl_GetGuid(IRecordInfo *iface, GUID *pguid)
Definition: recinfo.c:336
static ULONG WINAPI IRecordInfoImpl_Release(IRecordInfo *iface)
Definition: recinfo.c:168
HRESULT WINAPI GetRecordInfoFromTypeInfo(ITypeInfo *pTI, IRecordInfo **ppRecInfo)
Definition: recinfo.c:620
HRESULT WINAPI GetRecordInfoFromGuids(REFGUID rGuidTypeLib, ULONG uVerMajor, ULONG uVerMinor, LCID lcid, REFGUID rGuidTypeInfo, IRecordInfo **ppRecInfo)
Definition: recinfo.c:589
static HRESULT WINAPI IRecordInfoImpl_RecordClear(IRecordInfo *iface, PVOID pvExisting)
Definition: recinfo.c:199
static PVOID WINAPI IRecordInfoImpl_RecordCreate(IRecordInfo *iface)
Definition: recinfo.c:518
static BOOL WINAPI IRecordInfoImpl_IsMatchingType(IRecordInfo *iface, IRecordInfo *info2)
Definition: recinfo.c:507
static HRESULT WINAPI IRecordInfoImpl_PutFieldNoCopy(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:463
static HRESULT WINAPI IRecordInfoImpl_RecordInit(IRecordInfo *iface, PVOID pvNew)
Definition: recinfo.c:187
static HRESULT WINAPI IRecordInfoImpl_RecordDestroy(IRecordInfo *iface, PVOID pvRecord)
Definition: recinfo.c:545
static HRESULT WINAPI IRecordInfoImpl_RecordCreateCopy(IRecordInfo *iface, PVOID pvSource, PVOID *ppvDest)
Definition: recinfo.c:531
#define calloc
Definition: rosglue.h:14
const WCHAR * str
DWORD LCID
Definition: nls.h:13
#define R4(v, w, x, y, z, i)
Definition: sha1.c:39
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
IRecordInfo IRecordInfo_iface
Definition: recinfo.c:41
fieldstr * fields
Definition: recinfo.c:49
UINT lib_index
Definition: recinfo.c:45
ITypeInfo * pTypeInfo
Definition: recinfo.c:50
ULONG size
Definition: recinfo.c:47
Definition: scsiwmi.h:51
BSTR name
Definition: recinfo.c:37
VARKIND varkind
Definition: recinfo.c:35
enum VARENUM vt
Definition: recinfo.c:34
ULONG offset
Definition: recinfo.c:36
Definition: send.c:48
int32_t INT_PTR
Definition: typedefs.h:64
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
Definition: compat.h:2255
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:939
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
@ TKIND_RECORD
Definition: widltypes.h:235
@ TKIND_ALIAS
Definition: widltypes.h:240
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define TYPE_E_FIELDNOTFOUND
Definition: winerror.h:3633
unsigned char BYTE
Definition: xxhash.c:193