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

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

Initial port of OLE2.
Added regsvr32

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