Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendispex.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2008 Jacek Caban for CodeWeavers 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #define COBJMACROS 00020 00021 #include "config.h" 00022 00023 #include <stdarg.h> 00024 #include <assert.h> 00025 #include "windef.h" 00026 #include "winbase.h" 00027 #include "winuser.h" 00028 #include "winnls.h" 00029 #include "ole2.h" 00030 #include "msxml2.h" 00031 #include "wininet.h" 00032 #include "urlmon.h" 00033 #include "winreg.h" 00034 #include "shlwapi.h" 00035 00036 #include "wine/debug.h" 00037 #include "wine/list.h" 00038 #include "wine/unicode.h" 00039 00040 #include "msxml_private.h" 00041 00042 WINE_DEFAULT_DEBUG_CHANNEL(msxml); 00043 00044 #define DISPATCHEX(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) 00045 00046 typedef struct { 00047 DISPID id; 00048 BSTR name; 00049 enum tid_t tid; 00050 } func_info_t; 00051 00052 struct dispex_data_t { 00053 DWORD func_cnt; 00054 func_info_t *funcs; 00055 func_info_t **name_table; 00056 00057 struct list entry; 00058 }; 00059 00060 typedef struct { 00061 VARIANT var; 00062 LPWSTR name; 00063 } dynamic_prop_t; 00064 00065 struct dispex_dynamic_data_t { 00066 DWORD buf_size; 00067 DWORD prop_cnt; 00068 dynamic_prop_t *props; 00069 }; 00070 00071 #define DISPID_DYNPROP_0 0x50000000 00072 #define DISPID_DYNPROP_MAX 0x5fffffff 00073 00074 static struct list dispex_data_list = LIST_INIT(dispex_data_list); 00075 static ITypeLib *typelib; 00076 static ITypeInfo *typeinfos[LAST_tid]; 00077 00078 static REFIID tid_ids[] = { 00079 &IID_IXMLDOMAttribute, 00080 &IID_IXMLDOMCDATASection, 00081 &IID_IXMLDOMComment, 00082 &IID_IXMLDOMDocument, 00083 &IID_IXMLDOMDocument2, 00084 &IID_IXMLDOMDocumentFragment, 00085 &IID_IXMLDOMElement, 00086 &IID_IXMLDOMEntityReference, 00087 &IID_IXMLDOMImplementation, 00088 &IID_IXMLDOMNamedNodeMap, 00089 &IID_IXMLDOMNode, 00090 &IID_IXMLDOMNodeList, 00091 &IID_IXMLDOMParseError, 00092 &IID_IXMLDOMProcessingInstruction, 00093 &IID_IXMLDOMSchemaCollection, 00094 &IID_IXMLDOMSelection, 00095 &IID_IXMLDOMText, 00096 &IID_IXMLElement, 00097 &IID_IXMLDOMDocument, 00098 &IID_IXMLHTTPRequest, 00099 &IID_IVBSAXAttributes, 00100 &IID_IVBSAXContentHandler, 00101 &IID_IVBSAXDeclHandler, 00102 &IID_IVBSAXDTDHandler, 00103 &IID_IVBSAXEntityResolver, 00104 &IID_IVBSAXErrorHandler, 00105 &IID_IVBSAXLexicalHandler, 00106 &IID_IVBSAXLocator, 00107 &IID_IVBSAXXMLFilter, 00108 &IID_IVBSAXXMLReader, 00109 &IID_IMXAttributes, 00110 &IID_IMXReaderControl, 00111 &IID_IMXWriter, 00112 }; 00113 00114 HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) 00115 { 00116 HRESULT hres; 00117 00118 if(!typelib) { 00119 ITypeLib *tl; 00120 00121 hres = LoadRegTypeLib(&LIBID_MSXML2, 3, 0, LOCALE_SYSTEM_DEFAULT, &tl); 00122 if(FAILED(hres)) { 00123 ERR("LoadRegTypeLib failed: %08x\n", hres); 00124 return hres; 00125 } 00126 00127 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) 00128 ITypeLib_Release(tl); 00129 } 00130 00131 if(!typeinfos[tid]) { 00132 ITypeInfo *typeinfo; 00133 00134 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); 00135 if(FAILED(hres)) { 00136 ERR("GetTypeInfoOfGuid failed: %08x\n", hres); 00137 return hres; 00138 } 00139 00140 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) 00141 ITypeInfo_Release(typeinfo); 00142 } 00143 00144 *typeinfo = typeinfos[tid]; 00145 00146 ITypeInfo_AddRef(typeinfos[tid]); 00147 return S_OK; 00148 } 00149 00150 void release_typelib(void) 00151 { 00152 dispex_data_t *iter; 00153 unsigned i; 00154 00155 while(!list_empty(&dispex_data_list)) { 00156 iter = LIST_ENTRY(list_head(&dispex_data_list), dispex_data_t, entry); 00157 list_remove(&iter->entry); 00158 00159 for(i=0; i < iter->func_cnt; i++) 00160 SysFreeString(iter->funcs[i].name); 00161 00162 heap_free(iter->funcs); 00163 heap_free(iter->name_table); 00164 heap_free(iter); 00165 } 00166 00167 if(!typelib) 00168 return; 00169 00170 for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) 00171 if(typeinfos[i]) 00172 ITypeInfo_Release(typeinfos[i]); 00173 00174 ITypeLib_Release(typelib); 00175 } 00176 00177 static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id, ITypeInfo *dti) 00178 { 00179 HRESULT hres; 00180 00181 if(data->func_cnt && data->funcs[data->func_cnt-1].id == id) 00182 return; 00183 00184 if(data->func_cnt == *size) 00185 data->funcs = heap_realloc(data->funcs, (*size <<= 1)*sizeof(func_info_t)); 00186 00187 hres = ITypeInfo_GetDocumentation(dti, id, &data->funcs[data->func_cnt].name, NULL, NULL, NULL); 00188 if(FAILED(hres)) 00189 return; 00190 00191 data->funcs[data->func_cnt].id = id; 00192 data->funcs[data->func_cnt].tid = tid; 00193 00194 data->func_cnt++; 00195 } 00196 00197 static int dispid_cmp(const void *p1, const void *p2) 00198 { 00199 return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; 00200 } 00201 00202 static int func_name_cmp(const void *p1, const void *p2) 00203 { 00204 return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); 00205 } 00206 00207 static dispex_data_t *preprocess_dispex_data(DispatchEx *This) 00208 { 00209 const tid_t *tid = This->data->iface_tids; 00210 FUNCDESC *funcdesc; 00211 dispex_data_t *data; 00212 DWORD size = 16, i; 00213 ITypeInfo *ti, *dti; 00214 HRESULT hres; 00215 00216 TRACE("(%p)\n", This); 00217 00218 hres = get_typeinfo(This->data->disp_tid, &dti); 00219 if(FAILED(hres)) { 00220 ERR("Could not get disp type info: %08x\n", hres); 00221 return NULL; 00222 } 00223 00224 data = heap_alloc(sizeof(dispex_data_t)); 00225 data->func_cnt = 0; 00226 data->funcs = heap_alloc(size*sizeof(func_info_t)); 00227 list_add_tail(&dispex_data_list, &data->entry); 00228 00229 while(*tid) { 00230 hres = get_typeinfo(*tid, &ti); 00231 if(FAILED(hres)) 00232 break; 00233 00234 i=0; 00235 while(1) { 00236 hres = ITypeInfo_GetFuncDesc(ti, i++, &funcdesc); 00237 if(FAILED(hres)) 00238 break; 00239 00240 add_func_info(data, &size, *tid, funcdesc->memid, dti); 00241 ITypeInfo_ReleaseFuncDesc(ti, funcdesc); 00242 } 00243 00244 ITypeInfo_Release(ti); 00245 tid++; 00246 } 00247 00248 if(!data->func_cnt) { 00249 heap_free(data->funcs); 00250 data->funcs = NULL; 00251 }else if(data->func_cnt != size) { 00252 data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t)); 00253 } 00254 00255 qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp); 00256 00257 if(data->funcs) { 00258 data->name_table = heap_alloc(data->func_cnt * sizeof(func_info_t*)); 00259 for(i=0; i < data->func_cnt; i++) 00260 data->name_table[i] = data->funcs+i; 00261 qsort(data->name_table, data->func_cnt, sizeof(func_info_t*), func_name_cmp); 00262 }else { 00263 data->name_table = NULL; 00264 } 00265 00266 ITypeInfo_Release(dti); 00267 return data; 00268 } 00269 00270 static CRITICAL_SECTION cs_dispex_static_data; 00271 static CRITICAL_SECTION_DEBUG cs_dispex_static_data_dbg = 00272 { 00273 0, 0, &cs_dispex_static_data, 00274 { &cs_dispex_static_data_dbg.ProcessLocksList, &cs_dispex_static_data_dbg.ProcessLocksList }, 00275 0, 0, { (DWORD_PTR)(__FILE__ ": dispex_static_data") } 00276 }; 00277 static CRITICAL_SECTION cs_dispex_static_data = { &cs_dispex_static_data_dbg, -1, 0, 0, 0, 0 }; 00278 00279 00280 static dispex_data_t *get_dispex_data(DispatchEx *This) 00281 { 00282 if(This->data->data) 00283 return This->data->data; 00284 00285 EnterCriticalSection(&cs_dispex_static_data); 00286 00287 if(!This->data->data) 00288 This->data->data = preprocess_dispex_data(This); 00289 00290 LeaveCriticalSection(&cs_dispex_static_data); 00291 00292 return This->data->data; 00293 } 00294 00295 static inline BOOL is_custom_dispid(DISPID id) 00296 { 00297 return MSXML_DISPID_CUSTOM_MIN <= id && id <= MSXML_DISPID_CUSTOM_MAX; 00298 } 00299 00300 static inline BOOL is_dynamic_dispid(DISPID id) 00301 { 00302 return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX; 00303 } 00304 00305 static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface) 00306 { 00307 return (DispatchEx*)((char*)iface - FIELD_OFFSET(DispatchEx, lpIDispatchExVtbl)); 00308 } 00309 00310 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) 00311 { 00312 DispatchEx *This = impl_from_IDispatchEx(iface); 00313 00314 return IUnknown_QueryInterface(This->outer, riid, ppv); 00315 } 00316 00317 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) 00318 { 00319 DispatchEx *This = impl_from_IDispatchEx(iface); 00320 00321 return IUnknown_AddRef(This->outer); 00322 } 00323 00324 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) 00325 { 00326 DispatchEx *This = impl_from_IDispatchEx(iface); 00327 00328 return IUnknown_Release(This->outer); 00329 } 00330 00331 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) 00332 { 00333 DispatchEx *This = impl_from_IDispatchEx(iface); 00334 00335 TRACE("(%p)->(%p)\n", This, pctinfo); 00336 00337 *pctinfo = 1; 00338 return S_OK; 00339 } 00340 00341 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, 00342 LCID lcid, ITypeInfo **ppTInfo) 00343 { 00344 DispatchEx *This = impl_from_IDispatchEx(iface); 00345 00346 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); 00347 00348 return get_typeinfo(This->data->disp_tid, ppTInfo); 00349 } 00350 00351 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, 00352 LPOLESTR *rgszNames, UINT cNames, 00353 LCID lcid, DISPID *rgDispId) 00354 { 00355 DispatchEx *This = impl_from_IDispatchEx(iface); 00356 UINT i; 00357 HRESULT hres; 00358 00359 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, 00360 lcid, rgDispId); 00361 00362 for(i=0; i < cNames; i++) { 00363 hres = IDispatchEx_GetDispID(DISPATCHEX(This), rgszNames[i], 0, rgDispId+i); 00364 if(FAILED(hres)) 00365 return hres; 00366 } 00367 00368 return S_OK; 00369 } 00370 00371 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, 00372 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 00373 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 00374 { 00375 DispatchEx *This = impl_from_IDispatchEx(iface); 00376 00377 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), 00378 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 00379 00380 return IDispatchEx_InvokeEx(DISPATCHEX(This), dispIdMember, lcid, wFlags, 00381 pDispParams, pVarResult, pExcepInfo, NULL); 00382 } 00383 00384 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) 00385 { 00386 DispatchEx *This = impl_from_IDispatchEx(iface); 00387 dispex_data_t *data; 00388 int min, max, n, c; 00389 00390 TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); 00391 00392 if(grfdex & ~(fdexNameCaseSensitive|fdexNameEnsure|fdexNameImplicit)) 00393 FIXME("Unsupported grfdex %x\n", grfdex); 00394 00395 data = get_dispex_data(This); 00396 if(!data) 00397 return E_FAIL; 00398 00399 min = 0; 00400 max = data->func_cnt-1; 00401 00402 while(min <= max) { 00403 n = (min+max)/2; 00404 00405 c = strcmpiW(data->name_table[n]->name, bstrName); 00406 if(!c) { 00407 if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName)) 00408 break; 00409 00410 *pid = data->name_table[n]->id; 00411 return S_OK; 00412 } 00413 00414 if(c > 0) 00415 max = n-1; 00416 else 00417 min = n+1; 00418 } 00419 00420 if(This->dynamic_data) { 00421 unsigned i; 00422 00423 for(i=0; i < This->dynamic_data->prop_cnt; i++) { 00424 if(!strcmpW(This->dynamic_data->props[i].name, bstrName)) { 00425 *pid = DISPID_DYNPROP_0 + i; 00426 return S_OK; 00427 } 00428 } 00429 } 00430 00431 if(This->data->vtbl && This->data->vtbl->get_dispid) { 00432 HRESULT hres; 00433 00434 hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid); 00435 if(hres != DISP_E_UNKNOWNNAME) 00436 return hres; 00437 } 00438 00439 if(grfdex & fdexNameEnsure) { 00440 dispex_dynamic_data_t *dynamic_data; 00441 00442 TRACE("creating dynamic prop %s\n", debugstr_w(bstrName)); 00443 00444 if(This->dynamic_data) { 00445 dynamic_data = This->dynamic_data; 00446 }else { 00447 dynamic_data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t)); 00448 if(!dynamic_data) 00449 return E_OUTOFMEMORY; 00450 } 00451 00452 if(!dynamic_data->buf_size) { 00453 dynamic_data->props = heap_alloc(sizeof(dynamic_prop_t)*4); 00454 if(!dynamic_data->props) 00455 return E_OUTOFMEMORY; 00456 dynamic_data->buf_size = 4; 00457 }else if(dynamic_data->buf_size == dynamic_data->prop_cnt) { 00458 dynamic_prop_t *new_props; 00459 00460 new_props = heap_realloc(dynamic_data->props, sizeof(dynamic_prop_t)*(dynamic_data->buf_size<<1)); 00461 if(!new_props) 00462 return E_OUTOFMEMORY; 00463 00464 dynamic_data->props = new_props; 00465 dynamic_data->buf_size <<= 1; 00466 } 00467 00468 dynamic_data->props[dynamic_data->prop_cnt].name = heap_strdupW(bstrName); 00469 VariantInit(&dynamic_data->props[dynamic_data->prop_cnt].var); 00470 *pid = DISPID_DYNPROP_0 + dynamic_data->prop_cnt++; 00471 00472 return S_OK; 00473 } 00474 00475 TRACE("not found %s\n", debugstr_w(bstrName)); 00476 return DISP_E_UNKNOWNNAME; 00477 } 00478 00479 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, 00480 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) 00481 { 00482 DispatchEx *This = impl_from_IDispatchEx(iface); 00483 IUnknown *unk; 00484 ITypeInfo *ti; 00485 dispex_data_t *data; 00486 UINT argerr=0; 00487 int min, max, n; 00488 HRESULT hres; 00489 00490 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); 00491 00492 if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke) 00493 return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei); 00494 00495 if(wFlags == DISPATCH_CONSTRUCT) { 00496 FIXME("DISPATCH_CONSTRUCT not implemented\n"); 00497 return E_NOTIMPL; 00498 } 00499 00500 if(is_dynamic_dispid(id)) { 00501 DWORD idx = id - DISPID_DYNPROP_0; 00502 VARIANT *var; 00503 00504 if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) 00505 return DISP_E_UNKNOWNNAME; 00506 00507 var = &This->dynamic_data->props[idx].var; 00508 00509 switch(wFlags) { 00510 case INVOKE_PROPERTYGET: 00511 return VariantCopy(pvarRes, var); 00512 case INVOKE_PROPERTYPUT: 00513 VariantClear(var); 00514 return VariantCopy(var, pdp->rgvarg); 00515 default: 00516 FIXME("unhandled wFlags %x\n", wFlags); 00517 return E_NOTIMPL; 00518 } 00519 } 00520 00521 data = get_dispex_data(This); 00522 if(!data) 00523 return E_FAIL; 00524 00525 min = 0; 00526 max = data->func_cnt-1; 00527 00528 while(min <= max) { 00529 n = (min+max)/2; 00530 00531 if(data->funcs[n].id == id) 00532 break; 00533 00534 if(data->funcs[n].id < id) 00535 min = n+1; 00536 else 00537 max = n-1; 00538 } 00539 00540 if(min > max) { 00541 WARN("invalid id %x\n", id); 00542 return DISP_E_UNKNOWNNAME; 00543 } 00544 00545 hres = get_typeinfo(data->funcs[n].tid, &ti); 00546 if(FAILED(hres)) { 00547 ERR("Could not get type info: %08x\n", hres); 00548 return hres; 00549 } 00550 00551 hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk); 00552 if(FAILED(hres)) { 00553 ERR("Could not get iface: %08x\n", hres); 00554 return E_FAIL; 00555 } 00556 00557 hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr); 00558 00559 ITypeInfo_Release(ti); 00560 IUnknown_Release(unk); 00561 return hres; 00562 } 00563 00564 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) 00565 { 00566 DispatchEx *This = impl_from_IDispatchEx(iface); 00567 TRACE("Not implemented in native msxml3 (%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex); 00568 return E_NOTIMPL; 00569 } 00570 00571 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) 00572 { 00573 DispatchEx *This = impl_from_IDispatchEx(iface); 00574 TRACE("Not implemented in native msxml3 (%p)->(%x)\n", This, id); 00575 return E_NOTIMPL; 00576 } 00577 00578 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) 00579 { 00580 DispatchEx *This = impl_from_IDispatchEx(iface); 00581 TRACE("Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex); 00582 return E_NOTIMPL; 00583 } 00584 00585 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) 00586 { 00587 DispatchEx *This = impl_from_IDispatchEx(iface); 00588 TRACE("Not implemented in native msxml3 (%p)->(%x %p)\n", This, id, pbstrName); 00589 return E_NOTIMPL; 00590 } 00591 00592 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) 00593 { 00594 DispatchEx *This = impl_from_IDispatchEx(iface); 00595 TRACE(" Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, grfdex, id, pid); 00596 return E_NOTIMPL; 00597 } 00598 00599 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) 00600 { 00601 DispatchEx *This = impl_from_IDispatchEx(iface); 00602 TRACE("Not implemented in native msxml3 (%p)->(%p)\n", This, ppunk); 00603 return E_NOTIMPL; 00604 } 00605 00606 static IDispatchExVtbl DispatchExVtbl = { 00607 DispatchEx_QueryInterface, 00608 DispatchEx_AddRef, 00609 DispatchEx_Release, 00610 DispatchEx_GetTypeInfoCount, 00611 DispatchEx_GetTypeInfo, 00612 DispatchEx_GetIDsOfNames, 00613 DispatchEx_Invoke, 00614 DispatchEx_GetDispID, 00615 DispatchEx_InvokeEx, 00616 DispatchEx_DeleteMemberByName, 00617 DispatchEx_DeleteMemberByDispID, 00618 DispatchEx_GetMemberProperties, 00619 DispatchEx_GetMemberName, 00620 DispatchEx_GetNextDispID, 00621 DispatchEx_GetNameSpaceParent 00622 }; 00623 00624 BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv) 00625 { 00626 static const IID IID_UndocumentedScriptIface = 00627 {0x719c3050,0xf9d3,0x11cf,{0xa4,0x93,0x00,0x40,0x05,0x23,0xa8,0xa0}}; 00628 00629 if(IsEqualGUID(&IID_IDispatch, riid)) { 00630 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); 00631 *ppv = DISPATCHEX(This); 00632 }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { 00633 TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv); 00634 *ppv = DISPATCHEX(This); 00635 }else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) { 00636 TRACE("(%p)->(IID_UndocumentedScriptIface %p) returning NULL\n", This, ppv); 00637 *ppv = NULL; 00638 }else if (IsEqualGUID(&IID_IObjectIdentity, riid)) { 00639 TRACE("IID_IObjectIdentity not supported returning NULL\n"); 00640 *ppv = NULL; 00641 }else { 00642 return FALSE; 00643 } 00644 00645 if(*ppv) 00646 IUnknown_AddRef((IUnknown*)*ppv); 00647 return TRUE; 00648 } 00649 00650 void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data) 00651 { 00652 dispex->lpIDispatchExVtbl = &DispatchExVtbl; 00653 dispex->outer = outer; 00654 dispex->data = data; 00655 } Generated on Sun May 27 2012 04:24:20 for ReactOS by
1.7.6.1
|