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