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