static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t * progid_str; const WCHAR *progid; IDispatch *disp; IUnknown *obj; HRESULT hres; TRACE("\n"); if(flags != DISPATCH_CONSTRUCT) { FIXME("unsupported flags %x\n", flags); return E_NOTIMPL; } if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER) && ctx->safeopt != INTERFACE_USES_DISPEX) { FIXME("Unsupported safeopt %x\n", ctx->safeopt); return E_NOTIMPL; } if(argc != 1) { FIXME("unsupported argc %d\n", argc); return E_NOTIMPL; } hres = to_flat_string(ctx, argv[0], &progid_str, &progid); if(FAILED(hres)) return hres; obj = create_activex_object(ctx, progid); jsstr_release(progid_str); if(!obj) return throw_generic_error(ctx, JS_E_CANNOT_CREATE_OBJ, NULL); hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&disp); IUnknown_Release(obj); if(FAILED(hres)) { FIXME("Object does not support IDispatch\n"); return E_NOTIMPL; } *r = jsval_disp(disp); return S_OK; }
static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { IDispatch *disp; IUnknown *obj; BSTR progid; HRESULT hres; TRACE("\n"); if(flags != DISPATCH_CONSTRUCT) { FIXME("unsupported flags %x\n", flags); return E_NOTIMPL; } if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER) && ctx->safeopt != INTERFACE_USES_DISPEX) { FIXME("Unsupported safeopt %x\n", ctx->safeopt); return E_NOTIMPL; } if(arg_cnt(dp) != 1) { FIXME("unsupported arg_cnt %d\n", arg_cnt(dp)); return E_NOTIMPL; } hres = to_string(ctx, get_arg(dp,0), ei, &progid); if(FAILED(hres)) return hres; obj = create_activex_object(ctx, progid); SysFreeString(progid); if(!obj) return throw_generic_error(ctx, ei, JS_E_CANNOT_CREATE_OBJ, NULL); hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&disp); IUnknown_Release(obj); if(FAILED(hres)) { FIXME("Object does not support IDispatch\n"); return E_NOTIMPL; } V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = disp; return S_OK; }