Spot the Defect, Part Two
Some fun for a Monday -- for some definition of fun, I suppose. Here's a recent posting to Microsoft's internal Spot The Defect mailing list.
HRESULT CInvokeHelper::InvokeHelper(IDispatch *pDisp, long dispid, SAFEARRAY **param1)
{
HRESULT hr;
DISPPARAMS params;
EXCEPINFO hrInfo;
VARIANTARG args[1];
params.cArgs=1;
params.rgvarg=args;
params.cNamedArgs=0;
params.rgvarg[0].vt=VT_SAFEARRAY | VT_I4;
params.rgvarg[0].parray = *param1;
hr = pDisp->Invoke(dispid,IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, ¶ms, NULL, &hrInfo, NULL);
return returnVal(hr, hrInfo.scode);
}
HRESULT CInvokeHelper::returnVal(HRESULT invokeHr, HRESULT scodeHR)
{
m_invokeResult = invokeHr;
if(FAILED(invokeHr))
{
if(DISP_E_EXCEPTION == invokeHr)
return scodeHR;
return E_FAIL;
}
return S_OK;
}
The internal Spot The Defect players found a good dozen or so defects -- some quite serious -- in this simple code. How many can you find?