跟踪发现
STDMETHODIMP COleDispatchImpl::Invoke(
DISPID dispid, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams, LPVARIANT pvarResult,
LPEXCEPINFO pexcepinfo, UINT* puArgErr)
{
METHOD_PROLOGUE_EX_(CCmdTarget, Dispatch)
ASSERT_NULL_OR_POINTER(pvarResult, VARIANT);
ASSERT_NULL_OR_POINTER(pexcepinfo, EXCEPINFO);
ASSERT_NULL_OR_POINTER(puArgErr, UINT);
// make sure pvarResult is initialized
if (pvarResult != NULL)
AfxVariantInit(pvarResult);
// check arguments
if (riid != IID_NULL)
return DISP_E_UNKNOWNINTERFACE;
// allow subclass to disable Invoke
if (!pThis->IsInvokeAllowed(dispid))
return E_UNEXPECTED;
// copy param block for safety
DISPPARAMS params = *pDispParams;
pDispParams = ¶ms;
网上也有 http://support.microsoft.com/kb/q146120/