xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/windows/com.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 module core.sys.windows.com;
2 version (Windows):
3 @system:
4 
5 pragma(lib,"uuid");
6 
7 import core.atomic;
8 import core.sys.windows.windef /+: HRESULT, LONG, ULONG+/;
9 //import std.string;
10 
11 public import core.sys.windows.basetyps : GUID, IID, CLSID;
12 
13 public 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 
21 public import core.sys.windows.ole2ver : rmm, rup;
22 
23 public import core.sys.windows.unknwn : IUnknown, IClassFactory;
24 
25 public 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 
41 public import core.sys.windows.wtypes :
42     CLSCTX, OLECHAR, LPOLESTR, LPCOLESTR;
43 
44 alias CLSCTX_INPROC_SERVER     = CLSCTX.CLSCTX_INPROC_SERVER    ;
45 alias CLSCTX_INPROC_HANDLER    = CLSCTX.CLSCTX_INPROC_HANDLER   ;
46 alias CLSCTX_LOCAL_SERVER      = CLSCTX.CLSCTX_LOCAL_SERVER     ;
47 alias CLSCTX_INPROC_SERVER16   = CLSCTX.CLSCTX_INPROC_SERVER16  ;
48 alias CLSCTX_REMOTE_SERVER     = CLSCTX.CLSCTX_REMOTE_SERVER    ;
49 alias CLSCTX_INPROC_HANDLER16  = CLSCTX.CLSCTX_INPROC_HANDLER16 ;
50 alias CLSCTX_INPROC_SERVERX86  = CLSCTX.CLSCTX_INPROC_SERVERX86 ;
51 alias CLSCTX_INPROC_HANDLERX86 = CLSCTX.CLSCTX_INPROC_HANDLERX86;
52 
53 alias COINIT_APARTMENTTHREADED   = COINIT.COINIT_APARTMENTTHREADED;
54 alias COINIT_MULTITHREADED       = COINIT.COINIT_MULTITHREADED    ;
55 alias COINIT_DISABLE_OLE1DDE     = COINIT.COINIT_DISABLE_OLE1DDE  ;
56 alias COINIT_SPEED_OVER_MEMORY   = COINIT.COINIT_SPEED_OVER_MEMORY;
57 
58 public import core.sys.windows.uuid;
59 
60 extern (Windows)
61 {
62 
63 class ComObject : IUnknown
64 {
65 extern (Windows):
QueryInterface(const (IID)* riid,void ** ppv)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 
AddRef()80     ULONG AddRef()
81     {
82         return atomicOp!"+="(*cast(shared)&count, 1);
83     }
84 
Release()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