invoke.cpp
#include "headers.h"
HRESULT InvokeDispatch(IDispatch * pdisp, DISPID dispid, REFIID riid,
LCID lcid, WORD flags, DISPPARAMS * pDispParams, VARIANT * pvarResult,
EXCEPINFO * pExcepInfo, UINT * pError)
{
AssertReadPtr(pdisp);
HRESULT hr;
// We must addref the pointer before the invocation. Why? Consider
// this scenario: the invocation calls a method which calls back
// into the script engine, which triggers a garbage collection, which
// does the final release on the dispatch object. Then control returns
// back to the call to Invoke, which dereferences its "this" pointer
// and promptly crashes.
pdisp->AddRef();
hr = pdisp->Invoke(DISPID_VALUE, riid, lcid, flags, pDispParams,
pvarResult, pExcepInfo, pError);
pdisp->Release();
return hr;
}
BOOL IsValidDispatch(VARIANT * pvar)
{
AssertReadPtr(pvar);
return VT_DISPATCH == pvar->vt && NULL != pvar->pdispVal;
}