ReactOS  0.4.13-dev-39-g8b6696f
bindctx.c
Go to the documentation of this file.
1 /*
2  * BindCtx implementation
3  *
4  * Copyright 1999 Noomen Hamza
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 #include <stdarg.h>
22 #include <string.h>
23 
24 #define COBJMACROS
25 
26 #include "winerror.h"
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winnls.h"
30 #include "objbase.h"
31 
32 #include "wine/debug.h"
33 
35 
36 #define BINDCTX_FIRST_TABLE_SIZE 4
37 
38 /* data structure of the BindCtx table elements */
39 typedef struct BindCtxObject{
40 
41  IUnknown* pObj; /* point on a bound object */
42 
43  LPOLESTR pkeyObj; /* key associated to this bound object */
44 
45  BYTE regType; /* registration type: 1 if RegisterObjectParam and 0 if RegisterObjectBound */
46 
48 
49 /* BindCtx data structure */
50 typedef struct BindCtxImpl{
51 
53 
54  LONG ref; /* reference counter for this object */
55 
56  BindCtxObject* bindCtxTable; /* this is a table in which all bounded objects are stored*/
57  DWORD bindCtxTableLastIndex; /* first free index in the table */
58  DWORD bindCtxTableSize; /* size table */
59 
60  BIND_OPTS2 bindOption2; /* a structure which contains the bind options*/
61 
62 } BindCtxImpl;
63 
64 /* IBindCtx prototype functions : */
68 
69 static inline BindCtxImpl *impl_from_IBindCtx(IBindCtx *iface)
70 {
71 return CONTAINING_RECORD(iface, BindCtxImpl, IBindCtx_iface);
72 }
73 
74 /*******************************************************************************
75  * BindCtx_QueryInterface
76  *******************************************************************************/
77 static HRESULT WINAPI
79 {
81 
82  TRACE("(%p %s %p)\n",This, debugstr_guid(riid), ppvObject);
83 
84  /* Perform a sanity check on the parameters.*/
85  if (!ppvObject)
86  return E_POINTER;
87 
88  /* Initialize the return parameter.*/
89  *ppvObject = 0;
90 
91  /* Compare the riid with the interface IDs implemented by this object.*/
92  if (IsEqualIID(&IID_IUnknown, riid) ||
93  IsEqualIID(&IID_IBindCtx, riid))
94  {
95  *ppvObject = &This->IBindCtx_iface;
96  IBindCtx_AddRef(iface);
97  return S_OK;
98  }
99 
100  return E_NOINTERFACE;
101 }
102 
103 /******************************************************************************
104  * BindCtx_AddRef
105  ******************************************************************************/
107 {
109 
110  TRACE("(%p)\n",This);
111 
112  return InterlockedIncrement(&This->ref);
113 }
114 
115 /******************************************************************************
116  * BindCtx_Destroy (local function)
117  *******************************************************************************/
119 {
120  TRACE("(%p)\n",This);
121 
122  /* free the table space memory */
123  HeapFree(GetProcessHeap(),0,This->bindCtxTable);
124 
125  /* free the bindctx structure */
127 
128  return S_OK;
129 }
130 
131 /******************************************************************************
132  * BindCtx_Release
133  ******************************************************************************/
135 {
137  ULONG ref;
138 
139  TRACE("(%p)\n",This);
140 
141  ref = InterlockedDecrement(&This->ref);
142  if (ref == 0)
143  {
144  /* release all registered objects */
145  BindCtxImpl_ReleaseBoundObjects(&This->IBindCtx_iface);
146 
148  }
149  return ref;
150 }
151 
152 
153 /******************************************************************************
154  * BindCtx_RegisterObjectBound
155  ******************************************************************************/
156 static HRESULT WINAPI
158 {
160  DWORD lastIndex=This->bindCtxTableLastIndex;
161 
162  TRACE("(%p,%p)\n",This,punk);
163 
164  if (punk==NULL)
165  return S_OK;
166 
167  if (lastIndex == This->bindCtxTableSize)
168  {
170  if (FAILED(hr))
171  return hr;
172  }
173 
174  IUnknown_AddRef(punk);
175 
176  /* put the object in the first free element in the table */
177  This->bindCtxTable[lastIndex].pObj = punk;
178  This->bindCtxTable[lastIndex].pkeyObj = NULL;
179  This->bindCtxTable[lastIndex].regType = 0;
180  lastIndex= ++This->bindCtxTableLastIndex;
181 
182  return S_OK;
183 }
184 
185 /******************************************************************************
186  * BindCtx_RevokeObjectBound
187  ******************************************************************************/
188 static HRESULT WINAPI
190 {
191  DWORD index,j;
192 
194 
195  TRACE("(%p,%p)\n",This,punk);
196 
197  if (!punk)
198  return E_INVALIDARG;
199 
200  /* check if the object was registered or not */
202  return MK_E_NOTBOUND;
203 
204  if(This->bindCtxTable[index].pObj)
205  IUnknown_Release(This->bindCtxTable[index].pObj);
206  HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj);
207 
208  /* left-shift all elements in the right side of the current revoked object */
209  for(j=index; j<This->bindCtxTableLastIndex-1; j++)
210  This->bindCtxTable[j]= This->bindCtxTable[j+1];
211 
212  This->bindCtxTableLastIndex--;
213 
214  return S_OK;
215 }
216 
217 /******************************************************************************
218  * BindCtx_ReleaseBoundObjects
219  ******************************************************************************/
220 static HRESULT WINAPI
222 {
223  DWORD i;
224 
226 
227  TRACE("(%p)\n",This);
228 
229  for(i=0;i<This->bindCtxTableLastIndex;i++)
230  {
231  if(This->bindCtxTable[i].pObj)
232  IUnknown_Release(This->bindCtxTable[i].pObj);
233  HeapFree(GetProcessHeap(),0,This->bindCtxTable[i].pkeyObj);
234  }
235 
236  This->bindCtxTableLastIndex = 0;
237 
238  return S_OK;
239 }
240 
241 /******************************************************************************
242  * BindCtx_SetBindOptions
243  ******************************************************************************/
244 static HRESULT WINAPI
245 BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
246 {
248 
249  TRACE("(%p,%p)\n",This,pbindopts);
250 
251  if (pbindopts==NULL)
252  return E_POINTER;
253 
254  if (pbindopts->cbStruct > sizeof(BIND_OPTS2))
255  {
256  WARN("invalid size\n");
257  return E_INVALIDARG; /* FIXME : not verified */
258  }
259  memcpy(&This->bindOption2, pbindopts, pbindopts->cbStruct);
260  return S_OK;
261 }
262 
263 /******************************************************************************
264  * BindCtx_GetBindOptions
265  ******************************************************************************/
266 static HRESULT WINAPI
267 BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
268 {
270  ULONG cbStruct;
271 
272  TRACE("(%p,%p)\n",This,pbindopts);
273 
274  if (pbindopts==NULL)
275  return E_POINTER;
276 
277  cbStruct = pbindopts->cbStruct;
278  if (cbStruct > sizeof(BIND_OPTS2))
279  cbStruct = sizeof(BIND_OPTS2);
280 
281  memcpy(pbindopts, &This->bindOption2, cbStruct);
282  pbindopts->cbStruct = cbStruct;
283 
284  return S_OK;
285 }
286 
287 /******************************************************************************
288  * BindCtx_GetRunningObjectTable
289  ******************************************************************************/
290 static HRESULT WINAPI
292 {
294 
295  TRACE("(%p,%p)\n",This,pprot);
296 
297  if (pprot==NULL)
298  return E_POINTER;
299 
300  return GetRunningObjectTable(0, pprot);
301 }
302 
303 /******************************************************************************
304  * BindCtx_RegisterObjectParam
305  ******************************************************************************/
306 static HRESULT WINAPI
308 {
309  DWORD index=0;
311 
312  TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk);
313 
314  if (punk==NULL)
315  return E_INVALIDARG;
316 
317  if (pszkey!=NULL && BindCtxImpl_GetObjectIndex(This,NULL,pszkey,&index)==S_OK)
318  {
319  TRACE("Overwriting existing key\n");
320  if(This->bindCtxTable[index].pObj!=NULL)
321  IUnknown_Release(This->bindCtxTable[index].pObj);
322  This->bindCtxTable[index].pObj=punk;
323  IUnknown_AddRef(punk);
324  return S_OK;
325  }
326 
327  if (This->bindCtxTableLastIndex == This->bindCtxTableSize)
328  {
330  if (FAILED(hr))
331  return hr;
332  }
333 
334  This->bindCtxTable[This->bindCtxTableLastIndex].pObj = punk;
335  This->bindCtxTable[This->bindCtxTableLastIndex].regType = 1;
336 
337  if (pszkey==NULL)
338 
339  This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj=NULL;
340 
341  else
342  {
343 
344  This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj=
345  HeapAlloc(GetProcessHeap(),0,(sizeof(WCHAR)*(1+lstrlenW(pszkey))));
346 
347  if (This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj==NULL)
348  return E_OUTOFMEMORY;
349  lstrcpyW(This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj,pszkey);
350  }
351 
352  This->bindCtxTableLastIndex++;
353 
354  IUnknown_AddRef(punk);
355  return S_OK;
356 }
357 
358 /******************************************************************************
359  * BindCtx_GetObjectParam
360  ******************************************************************************/
361 static HRESULT WINAPI
363 {
364  DWORD index;
366 
367  TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk);
368 
369  if (punk==NULL)
370  return E_POINTER;
371 
372  *punk=0;
373 
375  return E_FAIL;
376 
377  IUnknown_AddRef(This->bindCtxTable[index].pObj);
378 
379  *punk = This->bindCtxTable[index].pObj;
380 
381  return S_OK;
382 }
383 
384 /******************************************************************************
385  * BindCtx_RevokeObjectParam
386  ******************************************************************************/
387 static HRESULT WINAPI
389 {
390  DWORD index,j;
391 
393 
394  TRACE("(%p,%s)\n",This,debugstr_w(ppenum));
395 
397  return E_FAIL;
398 
399  /* release the object if it's found */
400  if(This->bindCtxTable[index].pObj)
401  IUnknown_Release(This->bindCtxTable[index].pObj);
402  HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj);
403 
404  /* remove the object from the table with a left-shifting of all objects in the right side */
405  for(j=index; j<This->bindCtxTableLastIndex-1; j++)
406  This->bindCtxTable[j]= This->bindCtxTable[j+1];
407 
408  This->bindCtxTableLastIndex--;
409 
410  return S_OK;
411 }
412 
413 /******************************************************************************
414  * BindCtx_EnumObjectParam
415  ******************************************************************************/
416 static HRESULT WINAPI
418 {
419  TRACE("(%p,%p)\n",iface,pszkey);
420 
421  *pszkey = NULL;
422 
423  /* not implemented in native either */
424  return E_NOTIMPL;
425 }
426 
427 /********************************************************************************
428  * GetObjectIndex (local function)
429  ********************************************************************************/
431  IUnknown* punk,
432  LPOLESTR pszkey,
433  DWORD *index)
434 {
435  DWORD i;
436  BOOL found = FALSE;
437 
438  TRACE("(%p,%p,%p,%p)\n",This,punk,pszkey,index);
439 
440  if (punk==NULL)
441  /* search object identified by a register key */
442  for(i=0; ( (i<This->bindCtxTableLastIndex) && (!found));i++)
443  {
444  if(This->bindCtxTable[i].regType==1){
445 
446  if ( ( (This->bindCtxTable[i].pkeyObj==NULL) && (pszkey==NULL) ) ||
447  ( (This->bindCtxTable[i].pkeyObj!=NULL) &&
448  (pszkey!=NULL) &&
449  (lstrcmpW(This->bindCtxTable[i].pkeyObj,pszkey)==0)
450  )
451  )
452 
453  found = TRUE;
454  }
455  }
456  else
457  /* search object identified by a moniker*/
458  for(i=0; ( (i<This->bindCtxTableLastIndex) && (!found));i++)
459  if(This->bindCtxTable[i].pObj==punk)
460  found = TRUE;
461 
462  if (index != NULL)
463  *index=i-1;
464 
465  if (found)
466  return S_OK;
467  TRACE("key not found\n");
468  return S_FALSE;
469 }
470 
472 {
473  if (!This->bindCtxTableSize)
474  {
475  This->bindCtxTableSize = BINDCTX_FIRST_TABLE_SIZE;
476  This->bindCtxTable = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
477  This->bindCtxTableSize * sizeof(BindCtxObject));
478  }
479  else
480  {
481  This->bindCtxTableSize *= 2;
482 
483  This->bindCtxTable = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,This->bindCtxTable,
484  This->bindCtxTableSize * sizeof(BindCtxObject));
485  }
486 
487  if (!This->bindCtxTable)
488  return E_OUTOFMEMORY;
489 
490  return S_OK;
491 }
492 
493 
494 /* Virtual function table for the BindCtx class. */
495 static const IBindCtxVtbl VT_BindCtxImpl =
496 {
510 };
511 
512 /******************************************************************************
513  * BindCtx_Construct (local function)
514  *******************************************************************************/
516 {
517  TRACE("(%p)\n",This);
518 
519  /* Initialize the virtual function table.*/
520  This->IBindCtx_iface.lpVtbl = &VT_BindCtxImpl;
521  This->ref = 0;
522 
523  /* Initialize the BIND_OPTS2 structure */
524  This->bindOption2.cbStruct = sizeof(BIND_OPTS2);
525  This->bindOption2.grfFlags = 0;
526  This->bindOption2.grfMode = STGM_READWRITE;
527  This->bindOption2.dwTickCountDeadline = 0;
528 
529  This->bindOption2.dwTrackFlags = 0;
530  This->bindOption2.dwClassContext = CLSCTX_SERVER;
531  This->bindOption2.locale = GetThreadLocale();
532  This->bindOption2.pServerInfo = 0;
533 
534  /* Initialize the bindctx table */
535  This->bindCtxTableSize=0;
536  This->bindCtxTableLastIndex=0;
537  This->bindCtxTable = NULL;
538 
539  return S_OK;
540 }
541 
542 /******************************************************************************
543  * CreateBindCtx (OLE32.@)
544  *
545  * Creates a bind context. A bind context encompasses information and options
546  * used when binding to a moniker.
547  *
548  * PARAMS
549  * reserved [I] Reserved. Set to 0.
550  * ppbc [O] Address that receives the bind context object.
551  *
552  * RETURNS
553  * Success: S_OK.
554  * Failure: Any HRESULT code.
555  */
557 {
558  BindCtxImpl* newBindCtx;
559  HRESULT hr;
560 
561  TRACE("(%d,%p)\n",reserved,ppbc);
562 
563  if (!ppbc) return E_INVALIDARG;
564 
565  *ppbc = NULL;
566 
567  if (reserved != 0)
568  {
569  ERR("reserved should be 0, not 0x%x\n", reserved);
570  return E_INVALIDARG;
571  }
572 
573  newBindCtx = HeapAlloc(GetProcessHeap(), 0, sizeof(BindCtxImpl));
574  if (newBindCtx == 0)
575  return E_OUTOFMEMORY;
576 
577  hr = BindCtxImpl_Construct(newBindCtx);
578  if (FAILED(hr))
579  {
580  HeapFree(GetProcessHeap(),0,newBindCtx);
581  return hr;
582  }
583 
584  return BindCtxImpl_QueryInterface(&newBindCtx->IBindCtx_iface,&IID_IBindCtx,(void**)ppbc);
585 }
586 
587 /******************************************************************************
588  * BindMoniker [OLE32.@]
589  *
590  * Binds to a moniker.
591  *
592  * PARAMS
593  * pmk [I] Moniker to bind to.
594  * grfOpt [I] Reserved option flags. Set to 0.
595  * riid [I] ID of the interface to bind to.
596  * pvResult [O] Address that receives the interface of the object that was bound to.
597  *
598  * RETURNS
599  * Success: S_OK.
600  * Failure: Any HRESULT code.
601  */
603 {
604  HRESULT res;
605  IBindCtx * pbc;
606 
607  TRACE("(%p, %x, %s, %p)\n", pmk, grfOpt, debugstr_guid(riid), ppvResult);
608 
609  res = CreateBindCtx(grfOpt, &pbc);
610  if (SUCCEEDED(res))
611  {
612  res = IMoniker_BindToObject(pmk, pbc, NULL, riid, ppvResult);
613  IBindCtx_Release(pbc);
614  }
615  return res;
616 }
struct BindCtxImpl BindCtxImpl
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
static HRESULT WINAPI BindCtxImpl_ReleaseBoundObjects(IBindCtx *)
Definition: bindctx.c:221
#define E_NOINTERFACE
Definition: winerror.h:2364
HRESULT hr
Definition: shlfolder.c:183
interface IBindCtx * LPBC
Definition: objfwd.h:18
static HRESULT BindCtxImpl_ExpandTable(BindCtxImpl *)
Definition: bindctx.c:471
REFIID riid
Definition: precomp.h:44
static HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx *iface, IRunningObjectTable **pprot)
Definition: bindctx.c:291
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define WARN(fmt,...)
Definition: debug.h:111
static HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx *iface, BIND_OPTS *pbindopts)
Definition: bindctx.c:267
DWORD bindCtxTableLastIndex
Definition: bindctx.c:57
static HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx *iface, REFIID riid, void **ppvObject)
Definition: bindctx.c:78
DWORD bindCtxTableSize
Definition: bindctx.c:58
LPOLESTR pkeyObj
Definition: bindctx.c:43
static LPOLESTR
Definition: stg_prop.c:27
#define lstrlenW
Definition: compat.h:407
#define E_FAIL
Definition: ddrawi.h:102
static ULONG WINAPI BindCtxImpl_AddRef(IBindCtx *iface)
Definition: bindctx.c:106
Definition: send.c:47
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
#define MK_E_NOTBOUND
Definition: winerror.h:2790
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx *iface, BIND_OPTS *pbindopts)
Definition: bindctx.c:245
static HRESULT BindCtxImpl_Destroy(BindCtxImpl *This)
Definition: bindctx.c:118
static HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx *iface, IUnknown *punk)
Definition: bindctx.c:157
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
static HRESULT WINAPI BindCtxImpl_EnumObjectParam(IBindCtx *iface, IEnumString **pszkey)
Definition: bindctx.c:417
r reserved
Definition: btrfs.c:2655
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
GLuint index
Definition: glext.h:6031
IBindCtx IBindCtx_iface
Definition: bindctx.c:52
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static BindCtxImpl * impl_from_IBindCtx(IBindCtx *iface)
Definition: bindctx.c:69
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 GLint GLint j
Definition: glfuncs.h:250
static HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx *iface, LPOLESTR pszkey, IUnknown *punk)
Definition: bindctx.c:307
#define TRACE(s)
Definition: solgame.cpp:4
LONG ref
Definition: bindctx.c:54
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
static const IBindCtxVtbl VT_BindCtxImpl
Definition: bindctx.c:495
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
static HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx *iface, LPOLESTR ppenum)
Definition: bindctx.c:388
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
IUnknown * pObj
Definition: bindctx.c:41
static HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx *iface, IUnknown *punk)
Definition: bindctx.c:189
#define index(s, c)
Definition: various.h:29
struct BindCtxObject BindCtxObject
#define InterlockedDecrement
Definition: armddk.h:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
static ULONG WINAPI BindCtxImpl_Release(IBindCtx *iface)
Definition: bindctx.c:134
REFIID LPVOID * ppvObject
Definition: precomp.h:44
static HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx *iface, LPOLESTR pszkey, IUnknown **punk)
Definition: bindctx.c:362
WINE_DEFAULT_DEBUG_CHANNEL(ole)
interface IMoniker * LPMONIKER
Definition: objfwd.h:9
#define STGM_READWRITE
Definition: objbase.h:918
BindCtxObject * bindCtxTable
Definition: bindctx.c:56
#define ERR(fmt,...)
Definition: debug.h:109
#define S_OK
Definition: intsafe.h:59
static HRESULT BindCtxImpl_Construct(BindCtxImpl *This)
Definition: bindctx.c:515
#define InterlockedIncrement
Definition: armddk.h:53
#define lstrcpyW
Definition: compat.h:406
#define HeapReAlloc
Definition: compat.h:393
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT BindCtxImpl_GetObjectIndex(BindCtxImpl *, IUnknown *, LPOLESTR, DWORD *)
Definition: bindctx.c:430
HRESULT WINAPI BindMoniker(LPMONIKER pmk, DWORD grfOpt, REFIID riid, LPVOID *ppvResult)
Definition: bindctx.c:602
HRESULT WINAPI GetRunningObjectTable(DWORD reserved, LPRUNNINGOBJECTTABLE *pprot)
Definition: moniker.c:1039
BIND_OPTS2 bindOption2
Definition: bindctx.c:60
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
GLuint res
Definition: glext.h:9613
unsigned int ULONG
Definition: retypes.h:1
BYTE regType
Definition: bindctx.c:45
#define BINDCTX_FIRST_TABLE_SIZE
Definition: bindctx.c:36
#define E_POINTER
Definition: winerror.h:2365
#define HeapFree(x, y, z)
Definition: compat.h:394
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:90
LCID WINAPI GetThreadLocale(void)
Definition: lang.c:1449
#define SUCCEEDED(hr)
Definition: intsafe.h:57