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 < ARRAY_SIZE(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_PROCESS_ATTACH: 191 ieframe_instance = hInstDLL; 192 register_iewindow_class(); 193 DisableThreadLibraryCalls(ieframe_instance); 194 break; 195 case DLL_PROCESS_DETACH: 196 if (lpv) break; 197 unregister_iewindow_class(); 198 release_typelib(); 199 } 200 201 return TRUE; 202 } 203 204 /*********************************************************************** 205 * DllGetClassObject (ieframe.@) 206 */ 207 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 208 { 209 if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) { 210 TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv); 211 return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv); 212 } 213 214 if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) { 215 TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv); 216 return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv); 217 } 218 219 if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) { 220 TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv); 221 return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv); 222 } 223 224 if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) { 225 TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv); 226 return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv); 227 } 228 229 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 230 return CLASS_E_CLASSNOTAVAILABLE; 231 } 232 233 static const IClassFactoryVtbl InternetExplorerFactoryVtbl = { 234 ClassFactory_QueryInterface, 235 ClassFactory_AddRef, 236 ClassFactory_Release, 237 InternetExplorer_Create, 238 ClassFactory_LockServer 239 }; 240 241 IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl }; 242 243 static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = { 244 ClassFactory_QueryInterface, 245 ClassFactory_AddRef, 246 ClassFactory_Release, 247 InternetExplorerManager_Create, 248 ClassFactory_LockServer 249 }; 250 251 IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl }; 252 253 /*********************************************************************** 254 * DllCanUnloadNow (ieframe.@) 255 */ 256 HRESULT WINAPI DllCanUnloadNow(void) 257 { 258 TRACE("()\n"); 259 return module_ref ? S_FALSE : S_OK; 260 } 261 262 /*********************************************************************** 263 * DllRegisterServer (ieframe.@) 264 */ 265 HRESULT WINAPI DllRegisterServer(void) 266 { 267 TRACE("()\n"); 268 return __wine_register_resources(ieframe_instance); 269 } 270 271 /*********************************************************************** 272 * DllUnregisterServer (ieframe.@) 273 */ 274 HRESULT WINAPI DllUnregisterServer(void) 275 { 276 TRACE("()\n"); 277 return __wine_unregister_resources(ieframe_instance); 278 } 279 280 /*********************************************************************** 281 * IEGetWriteableHKCU (ieframe.@) 282 */ 283 HRESULT WINAPI IEGetWriteableHKCU(HKEY *pkey) 284 { 285 FIXME("(%p) stub\n", pkey); 286 return E_NOTIMPL; 287 } 288