
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;
}
