On 5/5/19 6:10 PM, Andreas Maier wrote:
+ /* Try to get a IEnumVARIANT by _NewEnum */ + hres = IDispatch_Invoke(obj, + DISPID_NEWENUM, &IID_NULL, LOCALE_NEUTRAL, + DISPATCH_METHOD, &dispparams, &varresult, + NULL, NULL); + if (FAILED(hres)) + { + ERR("Enumerator: no DISPID_NEWENUM.\n"); + hres = E_INVALIDARG; + goto cleanuperr; + } + if (V_VT(&varresult) == VT_DISPATCH) + { + enumvar = (IEnumVARIANT*)V_DISPATCH(&varresult); + VariantClear(&varresult); + } + else if (V_VT(&varresult) == VT_UNKNOWN) + { + hres = IUnknown_QueryInterface(V_UNKNOWN(&varresult), + &IID_IEnumVARIANT, (void**)&enumvar); + if (FAILED(hres)) + { + hres = E_INVALIDARG; + goto cleanuperr; + } + enumvar = (IEnumVARIANT*)V_DISPATCH(&varresult); + VariantClear(&varresult); + } + else + { + ERR("Enumerator: NewEnum unexpected type of varresult (%d).\n", V_VT(&varresult)); + hres = E_INVALIDARG; + goto cleanuperr; + }
This looks too complicated, you don't need to handle VT_UNKNOWN vs VT_DISPATCH differently, simply QI for IEnumVARIANT when you got either of those. Also you immediately free varresult after assigning it, that's wrong; for VT_UNKNOWN case you overwrite QI result with same original pointer. Additionally, 'isnull' field seems to be redundant.