1 /* 2 * Copyright 2011 Jacek Caban for CodeWeavers 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #include "ieframe.h" 20 21 #include "initguid.h" 22 #include "rpcproxy.h" 23 #include "shlguid.h" 24 #include "isguids.h" 25 #include "ieautomation.h" 26 27 #include "wine/debug.h" 28 29 WINE_DEFAULT_DEBUG_CHANNEL(ieframe); 30 31 LONG module_ref = 0; 32 HINSTANCE ieframe_instance; 33 34 static ITypeLib *typelib; 35 static ITypeInfo *typeinfos[LAST_tid]; 36 37 static REFIID tid_ids[] = { 38 #define XIID(iface) &IID_ ## iface, 39 #define XCLSID(class) &CLSID_ ## class, 40 TID_LIST 41 #undef XIID 42 #undef XCLSID 43 }; 44 45 static HRESULT load_typelib(void) 46 { 47 HRESULT hres; 48 ITypeLib *tl; 49 50 hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &tl); 51 if(FAILED(hres)) { 52 ERR("LoadRegTypeLib failed: %08x\n", hres); 53 return hres; 54 } 55 56 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) 57 ITypeLib_Release(tl); 58 return hres; 59 } 60 61 HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) 62 { 63 HRESULT hres; 64 65 if(!typelib) 66 hres = load_typelib(); 67 if(!typelib) 68 return hres; 69 70 if(!typeinfos[tid]) { 71 ITypeInfo *ti; 72 73 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti); 74 if(FAILED(hres)) { 75 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres); 76 return hres; 77 } 78 79 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL)) 80 ITypeInfo_Release(ti); 81 } 82 83 *typeinfo = typeinfos[tid]; 84 return S_OK; 85 } 86 87 static void release_typelib(void) 88 { 89 unsigned i; 90 91 if(!typelib) 92 return; 93 94 for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) { 95 if(typeinfos[i]) 96 ITypeInfo_Release(typeinfos[i]); 97 } 98 99 ITypeLib_Release(typelib); 100 } 101 102 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 103 { 104 *ppv = NULL; 105 106 if(IsEqualGUID(&IID_IUnknown, riid)) { 107 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); 108 *ppv = iface; 109 }else if(IsEqualGUID(&IID_IClassFactory, riid)) { 110 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); 111 *ppv = iface; 112 } 113 114 if(*ppv) { 115 IUnknown_AddRef((IUnknown*)*ppv); 116 return S_OK; 117 } 118 119 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 120 return E_NOINTERFACE; 121 } 122 123 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) 124 { 125 TRACE("(%p)\n", iface); 126 return 2; 127 } 128 129 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) 130 { 131 TRACE("(%p)\n", iface); 132 return 1; 133 } 134 135 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) 136 { 137 TRACE("(%p)->(%x)\n", iface, fLock); 138 return S_OK; 139 } 140 141 static const IClassFactoryVtbl WebBrowserFactoryVtbl = { 142 ClassFactory_QueryInterface, 143 ClassFactory_AddRef, 144 ClassFactory_Release, 145 WebBrowser_Create, 146 ClassFactory_LockServer 147 }; 148 149 static IClassFactory WebBrowserFactory = { &WebBrowserFactoryVtbl }; 150 151 static const IClassFactoryVtbl WebBrowserV1FactoryVtbl = { 152 ClassFactory_QueryInterface, 153 ClassFactory_AddRef, 154 ClassFactory_Release, 155 WebBrowserV1_Create, 156 ClassFactory_LockServer 157 }; 158 159 static IClassFactory WebBrowserV1Factory = { &WebBrowserV1FactoryVtbl }; 160 161 static const IClassFactoryVtbl InternetShortcutFactoryVtbl = { 162 ClassFactory_QueryInterface, 163 ClassFactory_AddRef, 164 ClassFactory_Release, 165 InternetShortcut_Create, 166 ClassFactory_LockServer 167 }; 168 169 static IClassFactory InternetShortcutFactory = { &InternetShortcutFactoryVtbl }; 170 171 static const IClassFactoryVtbl CUrlHistoryFactoryVtbl = { 172 ClassFactory_QueryInterface, 173 ClassFactory_AddRef, 174 ClassFactory_Release, 175 CUrlHistory_Create, 176 ClassFactory_LockServer 177 }; 178 179 static IClassFactory CUrlHistoryFactory = { &CUrlHistoryFactoryVtbl }; 180 181 /****************************************************************** 182 * DllMain (ieframe.@) 183 */ 184 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) 185 { 186 TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv); 187 188 switch(fdwReason) 189 { 190 case DLL_WINE_PREATTACH: 191 return FALSE; /* prefer native version */ 192 case DLL_PROCESS_ATTACH: 193 ieframe_instance = hInstDLL; 194 register_iewindow_class(); 195 DisableThreadLibraryCalls(ieframe_instance); 196 break; 197 case DLL_PROCESS_DETACH: 198 if (lpv) break; 199 unregister_iewindow_class(); 200 release_typelib(); 201 } 202 203 return TRUE; 204 } 205 206 /*********************************************************************** 207 * DllGetClassObject (ieframe.@) 208 */ 209 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 210 { 211 if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) { 212 TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv); 213 return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv); 214 } 215 216 if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) { 217 TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv); 218 return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv); 219 } 220 221 if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) { 222 TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv); 223 return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv); 224 } 225 226 if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) { 227 TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv); 228 return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv); 229 } 230 231 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 232 return CLASS_E_CLASSNOTAVAILABLE; 233 } 234 235 static const IClassFactoryVtbl InternetExplorerFactoryVtbl = { 236 ClassFactory_QueryInterface, 237 ClassFactory_AddRef, 238 ClassFactory_Release, 239 InternetExplorer_Create, 240 ClassFactory_LockServer 241 }; 242 243 IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl }; 244 245 static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = { 246 ClassFactory_QueryInterface, 247 ClassFactory_AddRef, 248 ClassFactory_Release, 249 InternetExplorerManager_Create, 250 ClassFactory_LockServer 251 }; 252 253 IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl }; 254 255 /*********************************************************************** 256 * DllCanUnloadNow (ieframe.@) 257 */ 258 HRESULT WINAPI DllCanUnloadNow(void) 259 { 260 TRACE("()\n"); 261 return module_ref ? S_FALSE : S_OK; 262 } 263 264 /*********************************************************************** 265 * DllRegisterServer (ieframe.@) 266 */ 267 HRESULT WINAPI DllRegisterServer(void) 268 { 269 TRACE("()\n"); 270 return __wine_register_resources(ieframe_instance); 271 } 272 273 /*********************************************************************** 274 * DllUnregisterServer (ieframe.@) 275 */ 276 HRESULT WINAPI DllUnregisterServer(void) 277 { 278 TRACE("()\n"); 279 return __wine_unregister_resources(ieframe_instance); 280 } 281 282 /*********************************************************************** 283 * IEGetWriteableHKCU (ieframe.@) 284 */ 285 HRESULT WINAPI IEGetWriteableHKCU(HKEY *pkey) 286 { 287 FIXME("(%p) stub\n", pkey); 288 return E_NOTIMPL; 289 } 290