Jacek Caban wrote:
static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex,
VARIANT *pvarResult)
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
index 3f8131c..41f32eb 100644
--- a/dlls/mshtml/main.c
+++ b/dlls/mshtml/main.c
@@ -51,10 +51,52 @@ DWORD mshtml_tls = 0;
static HINSTANCE shdoclc = NULL;
+static ITypeLib *typelib;
+static ITypeInfo *typeinfos[LAST_tid];
+
+static const REFIID tid_ids[] = {
+ &IID_IHTMLWindow2
+};
+
+HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo)
+{
+ HRESULT hres;
+
+ if(!typelib) {
+ hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT,
&typelib);
This isn't thread-safe.
+ if(FAILED(hres)) {
+ ERR("LoadRegTypeLib failed: %08x\n", hres);
+ return hres;
+ }
+ }
+
+ if(!typeinfos[tid]) {
+ hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid],
typeinfos+tid);
+ if(FAILED(hres)) {
+ ERR("GetTypeInfoOfGuid failed: %08x\n", hres);
+ return hres;
+ }
+ }
Why not just use the IID instead of an enumeration here? I know you're
trying to cache the typeinfo here, but the current implementation of
typelibs makes ITypeLib_GetTypeInfoOfGuid very cheap.
+
+ *typeinfo = typeinfos[tid];
+ return S_OK;
+}
+
static void thread_detach(void)
{
- thread_data_t *thread_data = get_thread_data(FALSE);
+ thread_data_t *thread_data;
+
+ if(typelib) {
+ unsigned i;
+
+ for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
+ if(typeinfos[i])
+ ITypeInfo_Release(typeinfos[i]);
+
+ ITypeLib_Release(typelib);
+ }
Why are you doing this from DLL_THREAD_DETACH and not DLL_PROCESS_DETACH?
--
Rob Shearman