static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { DispatchEx *This = DISPATCHEX_THIS(iface); dynamic_prop_t *dprop; dispex_data_t *data; int min, max, n, c; HRESULT hres; TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); if(grfdex & ~(fdexNameCaseSensitive|fdexNameEnsure|fdexNameImplicit)) FIXME("Unsupported grfdex %x\n", grfdex); data = get_dispex_data(This); if(!data) return E_FAIL; min = 0; max = data->func_cnt-1; while(min <= max) { n = (min+max)/2; c = strcmpiW(data->name_table[n]->name, bstrName); if(!c) { if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName)) break; *pid = data->name_table[n]->id; return S_OK; } if(c > 0) max = n-1; else min = n+1; } if(This->data->vtbl && This->data->vtbl->get_dispid) { HRESULT hres; hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid); if(hres != DISP_E_UNKNOWNNAME) return hres; } hres = get_dynamic_prop(This, bstrName, grfdex&fdexNameEnsure, &dprop); if(FAILED(hres)) return hres; *pid = DISPID_DYNPROP_0 + (dprop - This->dynamic_data->props); return S_OK; }
HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VARIANT **ret) { dynamic_prop_t *prop; HRESULT hres; hres = get_dynamic_prop(This, name, alloc, &prop); if(FAILED(hres)) return hres; *ret = &prop->var; return S_OK; }
HRESULT dispex_get_dynid(DispatchEx *This, const WCHAR *name, DISPID *id) { dynamic_prop_t *prop; HRESULT hres; hres = get_dynamic_prop(This, name, fdexNameEnsure, &prop); if(FAILED(hres)) return hres; *id = DISPID_DYNPROP_0 + (prop - This->dynamic_data->props); return S_OK; }
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { DispatchEx *This = impl_from_IDispatchEx(iface); dynamic_prop_t *dprop; HRESULT hres; TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %x\n", grfdex); hres = get_builtin_id(This, bstrName, grfdex, pid); if(hres != DISP_E_UNKNOWNNAME) return hres; hres = get_dynamic_prop(This, bstrName, grfdex, &dprop); if(FAILED(hres)) return hres; *pid = DISPID_DYNPROP_0 + (dprop - This->dynamic_data->props); return S_OK; }
HRESULT remove_prop(DispatchEx *This, BSTR name, VARIANT_BOOL *success) { dynamic_prop_t *prop; DISPID id; HRESULT hres; hres = get_builtin_id(This, name, 0, &id); if(hres == S_OK) { DISPID named_id = DISPID_PROPERTYPUT; VARIANT var; DISPPARAMS dp = {&var,&named_id,1,1}; EXCEPINFO ei; V_VT(&var) = VT_EMPTY; memset(&ei, 0, sizeof(ei)); hres = invoke_builtin_prop(This, id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); if(FAILED(hres)) return hres; *success = VARIANT_TRUE; return S_OK; } hres = get_dynamic_prop(This, name, 0, &prop); if(FAILED(hres)) { if(hres != DISP_E_UNKNOWNNAME) return hres; *success = VARIANT_FALSE; return S_OK; } VariantClear(&prop->var); prop->flags |= DYNPROP_DELETED; *success = VARIANT_TRUE; return S_OK; }