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