Listing 1: scrclbck.cpp Final version of Callback property
// ScrClbck.cpp : Implementation of CScriptCallback #include "stdafx.h" #include "SC.h" #include "ScrClbck.h" ////////////////////////////////////////////////////////////////////////// // CScriptCallback STDMETHODIMP CScriptCallback::get_Callback(VARIANT* pVal) { // Return copy of current value return VariantCopy(pVal, &m_vCallback); } STDMETHODIMP CScriptCallback::put_Callback(VARIANT newVal) { // Verify correct argument type if ( newVal.vt != VT_NULL && newVal.vt != VT_DISPATCH ) return E_INVALIDARG; // Copy the reference value HRESULT hResult = m_vCallback.Copy(&newVal); if ( FAILED(hResult) ) return hResult; // If set to null then we are done if ( m_vCallback.vt == VT_NULL ) return S_FALSE; // If callback provided invoke it DISPID dispidThis = DISPID_THIS; CComVariant vThis(static_cast<IDispatch*>(this)); DISPPARAMS params = { &vThis, &dispidThis, 1, 1 }; CComVariant vResult; m_vCallback.pdispVal->Invoke(DISPID_VALUE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &vResult, NULL, NULL); return S_OK; } //End of File