1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
module core.sys.windows.com;
version (Windows):
pragma(lib,"uuid");
import core.atomic;
import core.sys.windows.windef /+: HRESULT, LONG, ULONG+/;
//import std.string;
public import core.sys.windows.basetyps : GUID, IID, CLSID;
public import core.sys.windows.objbase :
CLSCTX_INPROC, CLSCTX_ALL, CLSCTX_SERVER,
COINIT,
CoBuildVersion, StringFromGUID2,
CoInitialize, CoInitializeEx, CoUninitialize, CoGetCurrentProcess,
CoCreateInstance,
CoFreeLibrary, CoFreeAllLibraries, CoFreeUnusedLibraries;
public import core.sys.windows.ole2ver : rmm, rup;
public import core.sys.windows.unknwn : IUnknown, IClassFactory;
public import core.sys.windows.winerror :
S_OK,
S_FALSE,
NOERROR,
E_NOTIMPL,
E_NOINTERFACE,
E_POINTER,
E_ABORT,
E_FAIL,
E_HANDLE,
CLASS_E_NOAGGREGATION,
E_OUTOFMEMORY,
E_INVALIDARG,
E_UNEXPECTED,
RPC_E_CHANGED_MODE;
public import core.sys.windows.wtypes :
CLSCTX, OLECHAR, LPOLESTR, LPCOLESTR;
alias CLSCTX_INPROC_SERVER = CLSCTX.CLSCTX_INPROC_SERVER ;
alias CLSCTX_INPROC_HANDLER = CLSCTX.CLSCTX_INPROC_HANDLER ;
alias CLSCTX_LOCAL_SERVER = CLSCTX.CLSCTX_LOCAL_SERVER ;
alias CLSCTX_INPROC_SERVER16 = CLSCTX.CLSCTX_INPROC_SERVER16 ;
alias CLSCTX_REMOTE_SERVER = CLSCTX.CLSCTX_REMOTE_SERVER ;
alias CLSCTX_INPROC_HANDLER16 = CLSCTX.CLSCTX_INPROC_HANDLER16 ;
alias CLSCTX_INPROC_SERVERX86 = CLSCTX.CLSCTX_INPROC_SERVERX86 ;
alias CLSCTX_INPROC_HANDLERX86 = CLSCTX.CLSCTX_INPROC_HANDLERX86;
alias COINIT_APARTMENTTHREADED = COINIT.COINIT_APARTMENTTHREADED;
alias COINIT_MULTITHREADED = COINIT.COINIT_MULTITHREADED ;
alias COINIT_DISABLE_OLE1DDE = COINIT.COINIT_DISABLE_OLE1DDE ;
alias COINIT_SPEED_OVER_MEMORY = COINIT.COINIT_SPEED_OVER_MEMORY;
public import core.sys.windows.uuid;
extern (Windows)
{
class ComObject : IUnknown
{
extern (Windows):
HRESULT QueryInterface(const(IID)* riid, void** ppv)
{
if (*riid == IID_IUnknown)
{
*ppv = cast(void*)cast(IUnknown)this;
AddRef();
return S_OK;
}
else
{ *ppv = null;
return E_NOINTERFACE;
}
}
ULONG AddRef()
{
return atomicOp!"+="(*cast(shared)&count, 1);
}
ULONG Release()
{
LONG lRef = atomicOp!"-="(*cast(shared)&count, 1);
if (lRef == 0)
{
// free object
// If we delete this object, then the postinvariant called upon
// return from Release() will fail.
// Just let the GC reap it.
//delete this;
return 0;
}
return cast(ULONG)lRef;
}
LONG count = 0; // object reference count
}
}
|