blob: 6935dd94f958706454333ba0a5ac40f7ce8123d0 [file] [log] [blame]
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
}
}