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