
module std.windows.iunknown;

private import std.c.windows.windows;

pragma(lib, "uuid.lib");

alias int HRESULT;

enum : int
{
	S_OK = 0,
	E_NOINTERFACE = cast(int)0x80004002,
}

struct GUID {          // size is 16
    align(1):
	DWORD Data1;
	WORD   Data2;
	WORD   Data3;
	BYTE  Data4[8];
}

alias GUID IID;

extern (C)
{
    extern IID IID_IUnknown;
}

class IUnknown
{
    HRESULT QueryInterface(IID* riid, out IUnknown pvObject)
    {
	if (riid == &IID_IUnknown)
	{
	    pvObject = this;
	    AddRef();
	    return S_OK;
	}
	else
	{   pvObject = null;
	    return E_NOINTERFACE;
	}
    }

    ULONG AddRef()
    {
	return ++count;
    }

    ULONG Release()
    {
	if (--count == 0)
	{
	    // free object
	    return 0;
	}
	return count;
    }

    int count = 1;
}
