source: trunk/src/ole32/new/iunknown.cpp@ 3456

Last change on this file since 3456 was 3456, checked in by davidr, 25 years ago

OLE32/NEW: Work-in-progress on adding apartment handling

File size: 3.0 KB
Line 
1/* $Id: iunknown.cpp,v 1.1 2000-04-27 22:18:23 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// ======================================================================
25
26typedef struct
27{
28 ICOM_VTABLE(IUnknown)* lpvtbl;
29 DWORD ref;
30} IUnknownImpl;
31
32static ULONG WIN32API IUnknownImpl_AddRef(LPUNKNOWN iface);
33static ULONG WIN32API IUnknownImpl_Release(LPUNKNOWN iface);
34static HRESULT WIN32API IUnknownImpl_QueryInterface(LPUNKNOWN iface,
35 REFIID riid, LPVOID * ppvObject);
36
37static ICOM_VTABLE(IUnknown) IUnknownVt =
38{
39 IUnknownImpl_QueryInterface,
40 IUnknownImpl_AddRef,
41 IUnknownImpl_Release
42};
43
44// ======================================================================
45// Local Methods
46// ======================================================================
47
48// ----------------------------------------------------------------------
49// IUnknownImpl_AddRef
50// ----------------------------------------------------------------------
51static ULONG WIN32API IUnknownImpl_AddRef(LPUNKNOWN iface)
52{
53 ICOM_THIS(IUnknownImpl, iface);
54
55 dprintf(("OLE32: IUnknown(%p)->AddRef()", This));
56
57 return ++(This->ref);
58}
59
60// ----------------------------------------------------------------------
61// IUnknownImpl_Release
62// ----------------------------------------------------------------------
63static ULONG WIN32API IUnknownImpl_Release(LPUNKNOWN iface)
64{
65 ICOM_THIS(IUnknownImpl, iface);
66
67 dprintf(("OLE32: IUnknown(%p)->Release()\n", This));
68
69 if (--(This->ref) == 0)
70 {
71 HeapFree(GetProcessHeap(), 0, This);
72 return 0;
73 }
74 return This->ref;
75}
76
77// ----------------------------------------------------------------------
78// IUnknownImpl_QueryInterface
79// ----------------------------------------------------------------------
80static HRESULT WIN32API IUnknownImpl_QueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID *ppvObject)
81{
82 ICOM_THIS(IUnknownImpl, iface);
83
84#ifdef DEBUG
85 oStringA tRiid(riid);
86 dprintf(("OLE32: IUnknown(%p)->QueryInterface(%s)\n", This, (char *)tRiid));
87#endif
88
89 if (IsEqualIID(&IID_IUnknown, riid))
90 {
91 dprintf((" ->IUnknown"));
92 *ppvObject = &(This->lpvtbl);
93 }
94 else
95 {
96 dprintf((" ->E_NOINTERFACE"));
97 return E_NOINTERFACE;
98 }
99
100 // Query Interface always increases the reference count by one...
101 IUnknownImpl_AddRef(iface);
102
103 return S_OK;
104}
105
106// ----------------------------------------------------------------------
107// IUnknownImpl_Constructor
108// ----------------------------------------------------------------------
109LPUNKNOWN IUnknownImpl_Constructor()
110{
111 IUnknownImpl * unk;
112
113 unk = (IUnknownImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IUnknownImpl));
114 unk->lpvtbl = &IUnknownVt;
115 unk->ref = 1;
116 return (LPUNKNOWN)unk;
117}
118
119
Note: See TracBrowser for help on using the repository browser.