diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index f665c8f8e00..6596f76bc0e 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -31,6 +31,61 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +static ITypeLib *typelib; +static ITypeInfo *typeinfos[LAST_tid]; + +static REFIID tid_ids[] = { + &IID_IHTMLWindow2, +}; + +HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) +{ + HRESULT hres; + + if(!typelib) { + ITypeLib *tl; + + hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl); + if(FAILED(hres)) { + ERR("LoadRegTypeLib failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) + ITypeLib_Release(tl); + } + + if(!typeinfos[tid]) { + ITypeInfo *typeinfo; + + hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); + if(FAILED(hres)) { + ERR("GetTypeInfoOfGuid failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) + ITypeInfo_Release(typeinfo); + } + + *typeinfo = typeinfos[tid]; + return S_OK; +} + +void release_typelib(void) +{ + unsigned i; + + if(!typelib) + return; + + for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) + if(typeinfos[i]) + ITypeInfo_Release(typeinfos[i]); + + ITypeLib_Release(typelib); +} + #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c index 0389833d0d7..1c52c5a07be 100644 --- a/dlls/mshtml/main.c +++ b/dlls/mshtml/main.c @@ -49,47 +49,6 @@ DWORD mshtml_tls = 0; static HINSTANCE shdoclc = NULL; -static ITypeLib *typelib; -static ITypeInfo *typeinfos[LAST_tid]; - -static REFIID tid_ids[] = { - &IID_IHTMLWindow2 -}; - -HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) -{ - HRESULT hres; - - if(!typelib) { - ITypeLib *tl; - - hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl); - if(FAILED(hres)) { - ERR("LoadRegTypeLib failed: %08x\n", hres); - return hres; - } - - if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) - ITypeLib_Release(tl); - } - - if(!typeinfos[tid]) { - ITypeInfo *typeinfo; - - hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); - if(FAILED(hres)) { - ERR("GetTypeInfoOfGuid failed: %08x\n", hres); - return hres; - } - - if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) - ITypeInfo_Release(typeinfo); - } - - *typeinfo = typeinfos[tid]; - return S_OK; -} - static void thread_detach(void) { thread_data_t *thread_data; @@ -107,16 +66,7 @@ static void thread_detach(void) static void process_detach(void) { close_gecko(); - - if(typelib) { - unsigned i; - - for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) - if(typeinfos[i]) - ITypeInfo_Release(typeinfos[i]); - - ITypeLib_Release(typelib); - } + release_typelib(); if(shdoclc) FreeLibrary(shdoclc); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1bd4bb121bb..67e27a4b102 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -57,6 +57,12 @@ typedef struct ConnectionPoint ConnectionPoint; typedef struct BSCallback BSCallback; typedef struct nsChannelBSC nsChannelBSC; +/* NOTE: make sure to keep in sync with dispex.c */ +typedef enum { + IHTMLWindow2_tid, + LAST_tid +} tid_t; + typedef struct { const IDispatchExVtbl *lpIDispatchExVtbl; @@ -524,13 +530,8 @@ HWND get_thread_hwnd(void); void push_task(task_t*); void remove_doc_tasks(const HTMLDocument*); -/* typelibs */ -enum tid_t { - IHTMLWindow2_tid, - LAST_tid -}; - -HRESULT get_typeinfo(enum tid_t, ITypeInfo**); +HRESULT get_typeinfo(tid_t,ITypeInfo**); +void release_typelib(void); DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B); DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);