| module core.sys.windows.com; |
| version (Windows): |
| @system: |
| |
| pragma(lib,"uuid"); |
| |
| import core.atomic; |
| import core.sys.windows.windef /+: HRESULT, LONG, ULONG+/; |
| //import std.string; |
| |
| public import core.sys.windows.basetyps : GUID, IID, CLSID; |
| |
| public import core.sys.windows.objbase : |
| CLSCTX_INPROC, CLSCTX_ALL, CLSCTX_SERVER, |
| COINIT, |
| CoBuildVersion, StringFromGUID2, |
| CoInitialize, CoInitializeEx, CoUninitialize, CoGetCurrentProcess, |
| CoCreateInstance, |
| CoFreeLibrary, CoFreeAllLibraries, CoFreeUnusedLibraries; |
| |
| public import core.sys.windows.ole2ver : rmm, rup; |
| |
| public import core.sys.windows.unknwn : IUnknown, IClassFactory; |
| |
| public import core.sys.windows.winerror : |
| S_OK, |
| S_FALSE, |
| NOERROR, |
| E_NOTIMPL, |
| E_NOINTERFACE, |
| E_POINTER, |
| E_ABORT, |
| E_FAIL, |
| E_HANDLE, |
| CLASS_E_NOAGGREGATION, |
| E_OUTOFMEMORY, |
| E_INVALIDARG, |
| E_UNEXPECTED, |
| RPC_E_CHANGED_MODE; |
| |
| public import core.sys.windows.wtypes : |
| CLSCTX, OLECHAR, LPOLESTR, LPCOLESTR; |
| |
| alias CLSCTX_INPROC_SERVER = CLSCTX.CLSCTX_INPROC_SERVER ; |
| alias CLSCTX_INPROC_HANDLER = CLSCTX.CLSCTX_INPROC_HANDLER ; |
| alias CLSCTX_LOCAL_SERVER = CLSCTX.CLSCTX_LOCAL_SERVER ; |
| alias CLSCTX_INPROC_SERVER16 = CLSCTX.CLSCTX_INPROC_SERVER16 ; |
| alias CLSCTX_REMOTE_SERVER = CLSCTX.CLSCTX_REMOTE_SERVER ; |
| alias CLSCTX_INPROC_HANDLER16 = CLSCTX.CLSCTX_INPROC_HANDLER16 ; |
| alias CLSCTX_INPROC_SERVERX86 = CLSCTX.CLSCTX_INPROC_SERVERX86 ; |
| alias CLSCTX_INPROC_HANDLERX86 = CLSCTX.CLSCTX_INPROC_HANDLERX86; |
| |
| alias COINIT_APARTMENTTHREADED = COINIT.COINIT_APARTMENTTHREADED; |
| alias COINIT_MULTITHREADED = COINIT.COINIT_MULTITHREADED ; |
| alias COINIT_DISABLE_OLE1DDE = COINIT.COINIT_DISABLE_OLE1DDE ; |
| alias COINIT_SPEED_OVER_MEMORY = COINIT.COINIT_SPEED_OVER_MEMORY; |
| |
| public import core.sys.windows.uuid; |
| |
| extern (Windows) |
| { |
| |
| class ComObject : IUnknown |
| { |
| extern (Windows): |
| HRESULT QueryInterface(const(IID)* riid, void** ppv) |
| { |
| if (*riid == IID_IUnknown) |
| { |
| *ppv = cast(void*)cast(IUnknown)this; |
| AddRef(); |
| return S_OK; |
| } |
| else |
| { *ppv = null; |
| return E_NOINTERFACE; |
| } |
| } |
| |
| ULONG AddRef() |
| { |
| return atomicOp!"+="(*cast(shared)&count, 1); |
| } |
| |
| ULONG Release() |
| { |
| LONG lRef = atomicOp!"-="(*cast(shared)&count, 1); |
| if (lRef == 0) |
| { |
| // free object |
| |
| // If we delete this object, then the postinvariant called upon |
| // return from Release() will fail. |
| // Just let the GC reap it. |
| //delete this; |
| |
| return 0; |
| } |
| return cast(ULONG)lRef; |
| } |
| |
| LONG count = 0; // object reference count |
| } |
| |
| } |