#pragma once

namespace FDK
{
	// IUnknown の標準実装。
	// IUnknown を継承するクラスは、このクラスも継承し、主に QueryInterface() をオーバーライドすること。

	private class CUnknown
	{
	public:
		CUnknown()
		{
			this->n参照カウント = 1;
		}
        virtual ~CUnknown()
        {
        }
		
		STDMETHOD( QueryInterface )( REFIID iid, void **ppv )
		{
			return S_OK;
		}
		STDMETHOD_( ULONG, AddRef )()
        {
            return ::InterlockedIncrement( &this->n参照カウント );
        }
        STDMETHOD_( ULONG, Release )()
        {
            ULONG uCount = ::InterlockedDecrement( &this->n参照カウント );
   
			if( uCount == 0 )
                delete this;

            return uCount;
        }

	protected:
        volatile long n参照カウント;
	};
}
