1 | #pragma once
|
---|
2 |
|
---|
3 | #include "windows_base.h"
|
---|
4 |
|
---|
5 | typedef interface IUnknown IUnknown;
|
---|
6 |
|
---|
7 | DEFINE_GUID(IID_IUnknown, 0x00000000,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46)
|
---|
8 |
|
---|
9 | #ifdef __cplusplus
|
---|
10 | struct IUnknown {
|
---|
11 |
|
---|
12 | public:
|
---|
13 |
|
---|
14 | virtual HRESULT QueryInterface(REFIID riid, void** ppvObject) = 0;
|
---|
15 | template<class Q>
|
---|
16 | HRESULT STDMETHODCALLTYPE QueryInterface(Q **pp) {
|
---|
17 | return QueryInterface(__uuidof(Q), (void **)pp);
|
---|
18 | }
|
---|
19 |
|
---|
20 | virtual ULONG AddRef() = 0;
|
---|
21 | virtual ULONG Release() = 0;
|
---|
22 |
|
---|
23 | };
|
---|
24 | #else
|
---|
25 | typedef struct IUnknownVtbl
|
---|
26 | {
|
---|
27 | BEGIN_INTERFACE
|
---|
28 |
|
---|
29 | HRESULT (STDMETHODCALLTYPE *QueryInterface)(
|
---|
30 | IUnknown *This,
|
---|
31 | REFIID riid,
|
---|
32 | void **ppvObject
|
---|
33 | );
|
---|
34 | ULONG (STDMETHODCALLTYPE *AddRef)(IUnknown *This);
|
---|
35 | ULONG (STDMETHODCALLTYPE *Release)(IUnknown *This);
|
---|
36 |
|
---|
37 | END_INTERFACE
|
---|
38 | } IUnknownVtbl;
|
---|
39 |
|
---|
40 | interface IUnknown
|
---|
41 | {
|
---|
42 | CONST_VTBL struct IUnknownVtbl *lpVtbl;
|
---|
43 | };
|
---|
44 |
|
---|
45 | #define IUnknown_AddRef(This) ((This)->lpVtbl->AddRef(This))
|
---|
46 | #define IUnknown_Release(This) ((This)->lpVtbl->Release(This))
|
---|
47 |
|
---|
48 | #endif // __cplusplus
|
---|
49 |
|
---|
50 | DECLARE_UUIDOF_HELPER(IUnknown, 0x00000000,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46)
|
---|
51 |
|
---|
52 | #define IID_PPV_ARGS(ppType) __uuidof(decltype(**(ppType))), [](auto** pp) { (void)static_cast<IUnknown*>(*pp); return reinterpret_cast<void**>(pp); }(ppType)
|
---|