#include "StdAfx.h"

class CEventSink : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispEventImpl<0, CEventSink, &DIID__ICaoSQLControllerEvents, &LIBID_CaoSQLLib, 1, 0>
{
public:
	CEventSink(){}

BEGIN_COM_MAP(CEventSink)
	COM_INTERFACE_ENTRY_IID(DIID__ICaoSQLControllerEvents, CEventSink)
END_COM_MAP()

BEGIN_SINK_MAP(CEventSink)
	SINK_ENTRY_EX(0, DIID__ICaoSQLControllerEvents, 1, OnChangeItem)
	SINK_ENTRY_EX(0, DIID__ICaoSQLControllerEvents, 2, OnChangeState)
END_SINK_MAP()

	STDMETHODIMP OnChangeItem(IUnknown* pICSItem)
	{
		USES_CONVERSION;
		CComVariant vntVal;
		CComPtr<ICaoSQLItem> pItem;
		HRESULT hr = pICSItem->QueryInterface(IID_ICaoSQLItem, (void**)&pItem);
		hr = pItem->get_Value(&vntVal);
		if (SUCCEEDED(hr)) {
			std::cout << "* OnChangeItem : " << W2A(vntVal.bstrVal) << std::endl;
		}
		return hr;
	}

	STDMETHODIMP OnChangeState(long lState)
	{
		USES_CONVERSION;
		char temp[20];
#if _MSC_VER <  1400
		std::cout << "* OnChangeState : " << ltoa(lState, temp, 10) << std::endl;
#else
		std::cout << "* OnChangeState : " << _ltoa_s(lState, temp, sizeof(temp), 10) << std::endl;
#endif
		return S_OK;
	}
};
