source: trunk/src/ole32/iunknown.cpp@ 1036

Last change on this file since 1036 was 872, checked in by davidr, 26 years ago

Added CVS ID lines to all source files

File size: 2.8 KB
Line 
1/* $Id: iunknown.cpp,v 1.3 1999-09-08 11:29:27 davidr Exp $ */
2/*
3 *
4 * Project Odin Software License can be found in LICENSE.TXT
5 *
6 */
7/*
8 * ClassID Manipulation.
9 *
10 * 18/7/99
11 *
12 * Copyright 1999 David J. Raison
13 *
14 * Some portions from Wine Implementation
15 * Copyright 1997 Marcus Meissner
16 */
17
18#include "ole32.h"
19
20#include "oString.h"
21
22// ======================================================================
23// Local Data
24// ======================================================================
25typedef struct
26{
27 /* IUnknown fields */
28 ICOM_VTABLE(IUnknown)* lpvtbl;
29 DWORD ref;
30} IUnknownImpl;
31
32static ULONG WIN32API IUnknown_fnAddRef(LPUNKNOWN iface);
33static ULONG WIN32API IUnknown_fnRelease(LPUNKNOWN iface);
34static HRESULT WIN32API IUnknown_fnQueryInterface(LPUNKNOWN iface, REFIID refiid, LPVOID * obj);
35
36static ICOM_VTABLE(IUnknown) uvt =
37{
38 IUnknown_fnQueryInterface,
39 IUnknown_fnAddRef,
40 IUnknown_fnRelease
41};
42
43// ======================================================================
44// Local Methods
45// ======================================================================
46
47// ----------------------------------------------------------------------
48// IUnknown_fnAddRef
49// ----------------------------------------------------------------------
50static ULONG WIN32API IUnknown_fnAddRef(LPUNKNOWN iface)
51{
52 ICOM_THIS(IUnknownImpl, iface);
53
54 dprintf(("OLE32: (%p)->AddRef()", This));
55
56 return ++(This->ref);
57}
58
59// ----------------------------------------------------------------------
60// IUnknown_fnRelease
61// ----------------------------------------------------------------------
62static ULONG WIN32API IUnknown_fnRelease(LPUNKNOWN iface)
63{
64 ICOM_THIS(IUnknownImpl, iface);
65
66 dprintf(("OLE32: (%p)->Release()\n", This));
67
68 if (--(This->ref) == 0)
69 {
70 HeapFree(GetProcessHeap(), 0, This);
71 return 0;
72 }
73 return This->ref;
74}
75
76// ----------------------------------------------------------------------
77// Initialize
78// ----------------------------------------------------------------------
79static HRESULT WIN32API IUnknown_fnQueryInterface(LPUNKNOWN iface, REFIID refiid, LPVOID *obj)
80{
81 ICOM_THIS(IUnknownImpl, iface);
82
83#ifdef DEBUG
84 oStringA tRefiid(refiid);
85 dprintf(("OLE32: (%p)->QueryInterface(%s, %p)\n", This, (char *)tRefiid, obj));
86#endif
87
88 if (!memcmp(&IID_IUnknown, refiid, sizeof(IID_IUnknown)))
89 {
90 *obj = This;
91 return 0;
92 }
93 return OLE_E_ENUM_NOMORE;
94}
95
96// ----------------------------------------------------------------------
97// Initialize
98// ----------------------------------------------------------------------
99LPUNKNOWN IUnknown_Constructor()
100{
101 IUnknownImpl * unk;
102
103 unk = (IUnknownImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IUnknownImpl));
104 unk->lpvtbl = &uvt;
105 unk->ref = 1;
106 return (LPUNKNOWN)unk;
107}
108
109
Note: See TracBrowser for help on using the repository browser.