static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { dispex_data_t *data; func_info_t *func; HRESULT hres; data = get_dispex_data(This); if(!data) return E_FAIL; hres = get_builtin_func(data, id, &func); if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) return dispex_value(This, lcid, flags, dp, res, ei, caller); if(FAILED(hres)) return hres; if(func->func_disp_idx != -1) return function_invoke(This, func, flags, dp, res, ei); switch(flags) { case DISPATCH_PROPERTYPUT: if(res) V_VT(res) = VT_EMPTY; hres = builtin_propput(This, func, dp, caller); break; case DISPATCH_PROPERTYGET: hres = builtin_propget(This, func, dp, res); break; default: if(!func->get_vtbl_off) { hres = typeinfo_invoke(This, func, flags, dp, res, ei); }else { VARIANT v; hres = builtin_propget(This, func, NULL, &v); if(FAILED(hres)) return hres; if(flags != (DISPATCH_PROPERTYGET|DISPATCH_METHOD)) { if(V_VT(&v) != VT_DISPATCH) { FIXME("Not a function %s\n", debugstr_variant(&v)); VariantClear(&v); return E_FAIL; } hres = invoke_disp_value(This, V_DISPATCH(&v), lcid, flags, dp, res, ei, caller); IDispatch_Release(V_DISPATCH(&v)); }else if(res) { *res = v; }else { IDispatch_Release(V_DISPATCH(&v)); } } } return hres; }
static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags) { JScript *This = impl_from_IActiveScript(iface); named_item_t *item; IDispatch *disp = NULL; HRESULT hres; TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags); if(This->thread_id != GetCurrentThreadId() || !This->ctx || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) { IUnknown *unk; hres = IActiveScriptSite_GetItemInfo(This->site, pstrName, SCRIPTINFO_IUNKNOWN, &unk, NULL); if(FAILED(hres)) { WARN("GetItemInfo failed: %08x\n", hres); return hres; } hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp); IUnknown_Release(unk); if(FAILED(hres)) { WARN("object does not implement IDispatch\n"); return hres; } if(This->ctx->host_global) IDispatch_Release(This->ctx->host_global); IDispatch_AddRef(disp); This->ctx->host_global = disp; } item = heap_alloc(sizeof(*item)); if(!item) { if(disp) IDispatch_Release(disp); return E_OUTOFMEMORY; } item->disp = disp; item->flags = dwFlags; item->name = heap_strdupW(pstrName); if(!item->name) { if(disp) IDispatch_Release(disp); heap_free(item); return E_OUTOFMEMORY; } item->next = This->ctx->named_items; This->ctx->named_items = item; return S_OK; }
static IDispatch *get_ie_target(HWND hwnd, int x, int y) { IDispatch *top_doc, *elem, *target; UINT getobj_msg; LRESULT lres, res; HRESULT hres; getobj_msg = RegisterWindowMessageW(L"WM_HTML_GETOBJECT"); if(getobj_msg == 0) { spr->log_lasterror( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call " L"RegisterWindowMessage(\"WM_HTML_GETOBJECT\")", 1); return NULL; } lres = SendMessageTimeout(hwnd, getobj_msg, 0, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&res); if(lres == 0) { spr->log_lasterror( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call SendMessageTimeout()", 1); return NULL; } hres = ObjectFromLresult(res, &IID_IDispatch, 0, (void **)(void *)&top_doc); if(FAILED(hres)) { spr->log_hresult( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call ObjectFromLresult()", hres, 1); return NULL; } hres = get_ie_elem_at(top_doc, x, y, &elem); IDispatch_Release(top_doc); if(FAILED(hres)) { return NULL; } hres = get_scrollable_parent(elem, &target); IDispatch_Release(elem); if(FAILED(hres)) { return NULL; } return target; }
void release_event_target(event_target_t *event_target) { int i, j; for(i=0; i < EVENTID_LAST; i++) { if(event_target->event_table[i]) { if(event_target->event_table[i]->handler_prop) IDispatch_Release(event_target->event_table[i]->handler_prop); for(j=0; j < event_target->event_table[i]->handler_cnt; j++) IDispatch_Release(event_target->event_table[i]->handlers[j]); } } heap_free(event_target); }
static void run_scripts(void) { IActiveScriptParse *parser; HRESULT hres; parser = create_script(); hres = IActiveScriptParse64_QueryInterface(parser, &IID_IVariantChangeType, (void**)&script_change_type); ok(hres == S_OK, "Could not get IVariantChangeType iface: %08x\n", hres); SET_EXPECT(testArgConv); parse_script_a(parser, "var obj = {" " toString: function() { return 'strval'; }," " valueOf: function() { return 10; }" "};" "testArgConv(obj);"); CHECK_CALLED(testArgConv); test_change_types(script_change_type, stored_obj); IDispatch_Release(stored_obj); IVariantChangeType_Release(script_change_type); IUnknown_Release(parser); }
static void navigate_complete(DocHost *This) { IDispatch *disp = NULL; DISPPARAMS dispparams; VARIANTARG params[2]; VARIANT url; HRESULT hres; hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp); if(FAILED(hres)) FIXME("Could not get IDispatch interface\n"); dispparams.cArgs = 2; dispparams.cNamedArgs = 0; dispparams.rgdispidNamedArgs = NULL; dispparams.rgvarg = params; V_VT(params) = (VT_BYREF|VT_VARIANT); V_BYREF(params) = &url; V_VT(params+1) = VT_DISPATCH; V_DISPATCH(params+1) = disp; V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocString(This->url); call_sink(This->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dispparams); call_sink(This->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dispparams); SysFreeString(V_BSTR(&url)); if(disp) IDispatch_Release(disp); This->busy = VARIANT_FALSE; }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) { WindowsMediaPlayer *This = impl_from_IOleObject(iface); IOleControlSite *control_site; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); release_client_site(This); if(!pClientSite) return S_OK; IOleClientSite_AddRef(pClientSite); This->client_site = pClientSite; hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleControlSite, (void**)&control_site); if(SUCCEEDED(hres)) { IDispatch *disp; hres = IOleControlSite_GetExtendedControl(control_site, &disp); if(SUCCEEDED(hres) && disp) { FIXME("Use extended control\n"); IDispatch_Release(disp); } IOleControlSite_Release(control_site); } return S_OK; }
void php_com_object_free_storage(zend_object *object) { php_com_dotnet_object *obj = (php_com_dotnet_object*)object; if (obj->typeinfo) { ITypeInfo_Release(obj->typeinfo); obj->typeinfo = NULL; } if (obj->sink_dispatch) { php_com_object_enable_event_sink(obj, FALSE); IDispatch_Release(obj->sink_dispatch); obj->sink_dispatch = NULL; } VariantClear(&obj->v); if (obj->method_cache) { zend_hash_destroy(obj->method_cache); FREE_HASHTABLE(obj->method_cache); } if (obj->id_of_name_cache) { zend_hash_destroy(obj->id_of_name_cache); FREE_HASHTABLE(obj->id_of_name_cache); } }
static void update_readystate(PluginHost *host) { DISPPARAMS params = {NULL,NULL,0,0}; IDispatchEx *dispex; IDispatch *disp; ULONG err = 0; VARIANT v; HRESULT hres; hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { FIXME("Use IDispatchEx\n"); IDispatchEx_Release(dispex); } hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatch, (void**)&disp); if(FAILED(hres)) return; hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, &v, NULL, &err); IDispatch_Release(disp); if(SUCCEEDED(hres)) { /* FIXME: make plugin readystate affect document readystate */ TRACE("readystate = %s\n", debugstr_variant(&v)); VariantClear(&v); } }
static HRESULT WINAPI PHInPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface) { PluginHost *This = impl_from_IOleInPlaceSiteEx(iface); DISPPARAMS args = {NULL, NULL, 0, 0}; IDispatch *disp; ULONG err = 0; VARIANT res; HRESULT hres; TRACE("(%p)\n", This); if(!This->plugin_unk) { ERR("No plugin object\n"); return E_UNEXPECTED; } This->ui_active = TRUE; hres = IUnknown_QueryInterface(This->plugin_unk, &IID_IDispatch, (void**)&disp); if(FAILED(hres)) { FIXME("Could not get IDispatch iface: %08x\n", hres); return hres; } V_VT(&res) = VT_EMPTY; hres = IDispatch_Invoke(disp, DISPID_ENABLED, &IID_NULL, 0/*FIXME*/, DISPATCH_PROPERTYGET, &args, &res, NULL, &err); IDispatch_Release(disp); if(SUCCEEDED(hres)) { FIXME("Got enabled %s\n", debugstr_variant(&res)); VariantClear(&res); } return S_OK; }
void release_dispex(DispatchEx *This) { dynamic_prop_t *prop; if(!This->dynamic_data) return; for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) { VariantClear(&prop->var); heap_free(prop->name); } heap_free(This->dynamic_data->props); if(This->dynamic_data->func_disps) { func_obj_entry_t *iter; for(iter = This->dynamic_data->func_disps; iter < This->dynamic_data->func_disps+This->data->data->func_disp_cnt; iter++) { if(iter->func_obj) { iter->func_obj->obj = NULL; IDispatchEx_Release(&iter->func_obj->dispex.IDispatchEx_iface); } if(iter->val) IDispatch_Release(iter->val); } heap_free(This->dynamic_data->func_disps); } heap_free(This->dynamic_data); }
HRESULT detach_event(EventTarget *event_target, BSTR name, IDispatch *disp) { event_target_t *data; eventid_t eid; DWORD i = 0; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); return S_OK; } data = get_event_target_data(event_target, FALSE); if(!data) return S_OK; if(!data->event_table[eid]) return S_OK; while(i < data->event_table[eid]->handler_cnt) { if(data->event_table[eid]->handlers[i] == disp) { IDispatch_Release(data->event_table[eid]->handlers[i]); data->event_table[eid]->handlers[i] = NULL; } i++; } return S_OK; }
static HRESULT get_doc_ready_state(DocHost *This, READYSTATE *ret) { DISPPARAMS dp = {NULL,NULL,0,0}; IDispatch *disp; EXCEPINFO ei; VARIANT var; HRESULT hres; hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp); if(FAILED(hres)) return hres; hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL); IDispatch_Release(disp); if(FAILED(hres)) { WARN("Invoke(DISPID_READYSTATE failed: %08x\n", hres); return hres; } if(V_VT(&var) != VT_I4) { WARN("V_VT(var) = %d\n", V_VT(&var)); VariantClear(&var); return E_FAIL; } *ret = V_I4(&var); return S_OK; }
void check_event_attr(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) { const PRUnichar *attr_value; nsAString attr_value_str; IDispatch *disp; HTMLDOMNode *node; int i; nsresult nsres; HRESULT hres; for(i=0; i < EVENTID_LAST; i++) { nsres = get_elem_attr_value(nselem, event_info[i].attr_name, &attr_value_str, &attr_value); if(NS_SUCCEEDED(nsres)) { if(!*attr_value) continue; TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value)); disp = script_parse_event(doc->window, attr_value); if(disp) { hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node); if(SUCCEEDED(hres)) { set_event_handler_disp(get_node_event_target(node), node->doc, i, disp); node_release(node); } IDispatch_Release(disp); } nsAString_Finish(&attr_value_str); } } }
static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface) { httprequest *This = impl_from_IXMLHTTPRequest( iface ); ULONG ref = InterlockedDecrement( &This->ref ); TRACE("(%p)->(%u)\n", This, ref ); if ( ref == 0 ) { struct reqheader *header, *header2; SysFreeString(This->url); SysFreeString(This->user); SysFreeString(This->password); /* request headers */ LIST_FOR_EACH_ENTRY_SAFE(header, header2, &This->reqheaders, struct reqheader, entry) { list_remove(&header->entry); SysFreeString(header->header); SysFreeString(header->value); } /* detach callback object */ BindStatusCallback_Detach(This->bsc); if (This->sink) IDispatch_Release(This->sink); heap_free( This ); } return ref; }
static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; IDispatch *this_obj = NULL; unsigned cnt = 0; HRESULT hres; TRACE("\n"); if(!(function = function_this(jsthis))) return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL); if(argc) { if(!is_undefined(argv[0]) && !is_null(argv[0])) { hres = to_object(ctx, argv[0], &this_obj); if(FAILED(hres)) return hres; } cnt = argc-1; } hres = call_function(ctx, function, this_obj, cnt, argv+1, r); if(this_obj) IDispatch_Release(this_obj); return hres; }
HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp) { eventid_t eid; DWORD i = 0; if(!event_target) return S_OK; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); return S_OK; } if(!event_target->event_table[eid]) return S_OK; while(i < event_target->event_table[eid]->handler_cnt) { if(event_target->event_table[eid]->handlers[i] == disp) { IDispatch_Release(event_target->event_table[eid]->handlers[i]); event_target->event_table[eid]->handlers[i] = NULL; } i++; } return S_OK; }
static void test_responseXML(const char *expect_text) { IDispatch *disp; IXMLDOMDocument *xmldom; IObjectSafety *safety; DWORD enabled = 0, supported = 0; HRESULT hres; disp = NULL; hres = IHTMLXMLHttpRequest_get_responseXML(xhr, &disp); ok(hres == S_OK, "get_responseXML failed: %08x\n", hres); ok(disp != NULL, "disp == NULL\n"); xmldom = NULL; hres = IDispatch_QueryInterface(disp, &IID_IXMLDOMDocument, (void**)&xmldom); ok(hres == S_OK, "QueryInterface(IXMLDOMDocument) failed: %08x\n", hres); ok(xmldom != NULL, "xmldom == NULL\n"); hres = IXMLDOMDocument_QueryInterface(xmldom, &IID_IObjectSafety, (void**)&safety); ok(hres == S_OK, "QueryInterface IObjectSafety failed: %08x\n", hres); hres = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) || supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */, "Expected supported: (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), got %08x\n", supported); ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), "Expected enabled: (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), got 0x%08x\n", enabled); IObjectSafety_Release(safety); if(!expect_text) test_illegal_xml(xmldom); IXMLDOMDocument_Release(xmldom); IDispatch_Release(disp); }
void test_interfaces(void) { HRESULT hr; IDispatch *disp; IDispatchEx *dispex; IFileSystem3 *fs3; IObjectWithSite *site; hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IDispatch, (void**)&disp); if(FAILED(hr)) { win_skip("Could not create FileSystem object: %08x\n", hr); return; } hr = IDispatch_QueryInterface(disp, &IID_IFileSystem3, (void**)&fs3); ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK); IFileSystem3_Release(fs3); hr = IDispatch_QueryInterface(disp, &IID_IObjectWithSite, (void**)&site); ok(hr == E_NOINTERFACE, "got 0x%08x, expected 0x%08x\n", hr, E_NOINTERFACE); hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); ok(hr == E_NOINTERFACE, "got 0x%08x, expected 0x%08x\n", hr, E_NOINTERFACE); IDispatch_Release(disp); }
static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser2 *iface, IDispatch **ppDisp) { WebBrowser *This = impl_from_IWebBrowser2(iface); IDispatch *disp = NULL; TRACE("(%p)->(%p)\n", This, ppDisp); if(This->doc_host.document) { HRESULT hres; hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IDispatch, (void**)&disp); if(SUCCEEDED(hres)) { IDispatch *html_doc; /* Some broken apps cast returned IDispatch to IHTMLDocument2 * without QueryInterface call */ hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc); if(SUCCEEDED(hres)) { IDispatch_Release(disp); disp = html_doc; } } } *ppDisp = disp; return S_OK; }
HRESULT WINAPI WindowFromAccessibleObject(IAccessible *acc, HWND *phwnd) { IDispatch *parent; IOleWindow *ow; HRESULT hres; TRACE("%p %p\n", acc, phwnd); IAccessible_AddRef(acc); while(1) { hres = IAccessible_QueryInterface(acc, &IID_IOleWindow, (void**)&ow); if(SUCCEEDED(hres)) { hres = IOleWindow_GetWindow(ow, phwnd); IOleWindow_Release(ow); IAccessible_Release(acc); return hres; } hres = IAccessible_get_accParent(acc, &parent); IAccessible_Release(acc); if(FAILED(hres)) return hres; if(hres!=S_OK || !parent) { *phwnd = NULL; return hres; } hres = IDispatch_QueryInterface(parent, &IID_IAccessible, (void**)&acc); IDispatch_Release(parent); if(FAILED(hres)) return hres; } }
static HRESULT remove_event_handler(event_target_t **event_target, eventid_t eid) { if(*event_target && (*event_target)->event_table[eid] && (*event_target)->event_table[eid]->handler_prop) { IDispatch_Release((*event_target)->event_table[eid]->handler_prop); (*event_target)->event_table[eid]->handler_prop = NULL; } return S_OK; }
void php_com_dotnet_rshutdown(void) { struct dotnet_runtime_stuff *stuff = COMG(dotnet_runtime_stuff); if (stuff->dotnet_domain) { IDispatch_Release(stuff->dotnet_domain); stuff->dotnet_domain = NULL; } }
static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { FunctionInstance *function; DISPPARAMS args = {NULL,NULL,0,0}; DWORD argc, i; IDispatch *this_obj = NULL; HRESULT hres = S_OK; TRACE("\n"); if(!(function = function_this(jsthis))) return throw_type_error(ctx, ei, JS_E_FUNCTION_EXPECTED, NULL); argc = arg_cnt(dp); if(argc) { VARIANT *v = get_arg(dp,0); if(V_VT(v) != VT_EMPTY && V_VT(v) != VT_NULL) { hres = to_object(ctx, v, &this_obj); if(FAILED(hres)) return hres; } } if(argc >= 2) { jsdisp_t *arg_array = NULL; if(V_VT(get_arg(dp,1)) == VT_DISPATCH) { arg_array = iface_to_jsdisp((IUnknown*)V_DISPATCH(get_arg(dp,1))); if(arg_array && (!is_class(arg_array, JSCLASS_ARRAY) && !is_class(arg_array, JSCLASS_ARGUMENTS) )) { jsdisp_release(arg_array); arg_array = NULL; } } if(arg_array) { hres = array_to_args(ctx, arg_array, ei, caller, &args); jsdisp_release(arg_array); }else { FIXME("throw TypeError\n"); hres = E_FAIL; } } if(SUCCEEDED(hres)) hres = call_function(ctx, function, this_obj, &args, retv, ei, caller); if(this_obj) IDispatch_Release(this_obj); for(i=0; i<args.cArgs; i++) VariantClear(args.rgvarg+i); heap_free(args.rgvarg); return hres; }
static HRESULT WINAPI httprequest_put_onreadystatechange(IXMLHTTPRequest *iface, IDispatch *sink) { httprequest *This = impl_from_IXMLHTTPRequest( iface ); TRACE("(%p)->(%p)\n", This, sink); if (This->sink) IDispatch_Release(This->sink); if ((This->sink = sink)) IDispatch_AddRef(This->sink); return S_OK; }
static int MP_OP_API ie_scroll_end_scroll(void *ctxp) { struct ie_scroll_context *ctx; ctx = (struct ie_scroll_context *)ctxp; IDispatch_Release(ctx->target); return 1; }
static void ConnectionPoint_Destroy(ConnectionPoint *This) { DWORD i; for(i=0; i<This->sinks_size; i++) { if(This->sinks[i]) IDispatch_Release(This->sinks[i]); } heap_free(This->sinks); heap_free(This); }
static void ConnectionPoint_Destroy(ConnectionPoint *This) { int i; for(i=0; i<This->sinks_size; i++) { if(This->sinks[i]) IDispatch_Release(This->sinks[i]); } shdocvw_free(This->sinks); shdocvw_free(This); }
static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; jsval_t *args = NULL; unsigned i, cnt = 0; IDispatch *this_obj = NULL; HRESULT hres = S_OK; TRACE("\n"); if(!(function = function_this(jsthis))) return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL); if(argc) { if(!is_undefined(argv[0]) && !is_null(argv[0])) { hres = to_object(ctx, argv[0], &this_obj); if(FAILED(hres)) return hres; } } if(argc >= 2) { jsdisp_t *arg_array = NULL; if(is_object_instance(argv[1])) { arg_array = iface_to_jsdisp((IUnknown*)get_object(argv[1])); if(arg_array && (!is_class(arg_array, JSCLASS_ARRAY) && !is_class(arg_array, JSCLASS_ARGUMENTS) )) { jsdisp_release(arg_array); arg_array = NULL; } } if(arg_array) { hres = array_to_args(ctx, arg_array, &cnt, &args); jsdisp_release(arg_array); }else { FIXME("throw TypeError\n"); hres = E_FAIL; } } if(SUCCEEDED(hres)) hres = call_function(ctx, function, this_obj, cnt, args, r); if(this_obj) IDispatch_Release(this_obj); for(i=0; i < cnt; i++) jsval_release(args[i]); heap_free(args); return hres; }
void DocHost_Release(DocHost *This) { if(This->client_disp) IDispatch_Release(This->client_disp); if(This->frame) IOleInPlaceFrame_Release(This->frame); DocHost_ClientSite_Release(This); ConnectionPointContainer_Destroy(&This->cps); SysFreeString(This->url); }