* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include <config.h>
-
-//#include <stdarg.h>
-//#include <stdio.h>
-
-//#include "wine/unicode.h"
-#include <wine/debug.h>
-
#include "shdocvw.h"
-//#include "winreg.h"
#include <shlwapi.h>
#include <wininet.h>
-//#include "initguid.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
-
LONG SHDOCVW_refCount = 0;
-HINSTANCE shdocvw_hinstance = 0;
static HMODULE SHDOCVW_hshell32 = 0;
-static ITypeInfo *wb_typeinfo = NULL;
+static HINSTANCE ieframe_instance;
-HRESULT get_typeinfo(ITypeInfo **typeinfo)
+static HINSTANCE get_ieframe_instance(void)
{
- ITypeLib *typelib;
- HRESULT hres;
+ static const WCHAR ieframe_dllW[] = {'i','e','f','r','a','m','e','.','d','l','l',0};
- if(wb_typeinfo) {
- *typeinfo = wb_typeinfo;
- return S_OK;
- }
+ if(!ieframe_instance)
+ ieframe_instance = LoadLibraryW(ieframe_dllW);
- hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &typelib);
- if(FAILED(hres)) {
- ERR("LoadRegTypeLib failed: %08x\n", hres);
- return hres;
- }
+ return ieframe_instance;
+}
+
+static HRESULT get_ieframe_object(REFCLSID rclsid, REFIID riid, void **ppv)
+{
+ HINSTANCE ieframe_instance;
+
+ static HRESULT (WINAPI *ieframe_DllGetClassObject)(REFCLSID,REFIID,void**);
+
+ if(!ieframe_DllGetClassObject) {
+ ieframe_instance = get_ieframe_instance();
+ if(!ieframe_instance)
+ return CLASS_E_CLASSNOTAVAILABLE;
- hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IWebBrowser2, &wb_typeinfo);
- ITypeLib_Release(typelib);
-
- *typeinfo = wb_typeinfo;
- return hres;
-}
-
-const char *debugstr_variant(const VARIANT *v)
-{
- if(!v)
- return "(null)";
-
- switch(V_VT(v)) {
- case VT_EMPTY:
- return "{VT_EMPTY}";
- case VT_NULL:
- return "{VT_NULL}";
- case VT_I4:
- return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v));
- case VT_R8:
- return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v));
- case VT_BSTR:
- return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v)));
- case VT_DISPATCH:
- return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
- case VT_BOOL:
- return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
- default:
- return wine_dbg_sprintf("{vt %d}", V_VT(v));
+ ieframe_DllGetClassObject = (void*)GetProcAddress(ieframe_instance, "DllGetClassObject");
+ if(!ieframe_DllGetClassObject)
+ return CLASS_E_CLASSNOTAVAILABLE;
}
+
+ return ieframe_DllGetClassObject(rclsid, riid, ppv);
+}
+
+/*************************************************************************
+ * DllGetClassObject (SHDOCVW.@)
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
+{
+ TRACE("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if(IsEqualGUID(&CLSID_WebBrowser, rclsid)
+ || IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)
+ || IsEqualGUID(&CLSID_InternetShortcut, rclsid)
+ || IsEqualGUID(&CLSID_CUrlHistory, rclsid)
+ || IsEqualGUID(&CLSID_TaskbarList, rclsid))
+ return get_ieframe_object(rclsid, riid, ppv);
+
+ /* As a last resort, figure if the CLSID belongs to a 'Shell Instance Object' */
+ return SHDOCVW_GetShellInstanceObjectClassObject(rclsid, riid, ppv);
+}
+
+/***********************************************************************
+ * DllRegisterServer (shdocvw.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+ TRACE("\n");
+ return S_OK;
+}
+
+/***********************************************************************
+ * DllUnregisterServer (shdocvw.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ TRACE("\n");
+ return S_OK;
+}
+
+/******************************************************************
+ * IEWinMain (SHDOCVW.101)
+ *
+ * Only returns on error.
+ */
+DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
+{
+ DWORD (WINAPI *pIEWinMain)(const WCHAR*,int);
+ WCHAR *cmdline;
+ DWORD ret, len;
+
+ TRACE("%s %d\n", debugstr_a(szCommandLine), nShowWindow);
+
+ pIEWinMain = (void*)GetProcAddress(get_ieframe_instance(), MAKEINTRESOURCEA(101));
+ if(!pIEWinMain)
+ ExitProcess(1);
+
+ len = MultiByteToWideChar(CP_ACP, 0, szCommandLine, -1, NULL, 0);
+ cmdline = heap_alloc(len*sizeof(WCHAR));
+ if(!cmdline)
+ ExitProcess(1);
+ MultiByteToWideChar(CP_ACP, 0, szCommandLine, -1, cmdline, len);
+
+ ret = pIEWinMain(cmdline, nShowWindow);
+
+ heap_free(cmdline);
+ return ret;
}
/*************************************************************************
TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad);
switch (fdwReason)
{
- case DLL_PROCESS_ATTACH:
- shdocvw_hinstance = hinst;
- register_iewindow_class();
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hinst);
break;
case DLL_PROCESS_DETACH:
+ if (fImpLoad) break;
if (SHDOCVW_hshell32) FreeLibrary(SHDOCVW_hshell32);
- unregister_iewindow_class();
- if(wb_typeinfo)
- ITypeInfo_Release(wb_typeinfo);
+ if (ieframe_instance) FreeLibrary(ieframe_instance);
break;
}
return TRUE;
return 0x0deadbee;
}
+/***********************************************************************
+ * @ (SHDOCVW.130)
+ *
+ * Called by Emerge Desktop (alternative Windows Shell).
+ */
+DWORD WINAPI RunInstallUninstallStubs2(int arg)
+{
+ FIXME("(%d), stub!\n", arg);
+ return 0x0deadbee;
+}
+
/***********************************************************************
* SetQueryNetSessionCount (SHDOCVW.@)
*/
}
/******************************************************************
- * StopWatchWFORWARD (SHDOCVW.@)
+ * StopWatchAFORWARD (SHDOCVW.@)
*/
-DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
+DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown,
DWORD dwMode, DWORD dwTimeStamp)
{
- static DWORD (WINAPI *p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD);
+ static DWORD (WINAPI *p)(DWORD, LPCSTR, DWORD, DWORD, DWORD);
if (p || (p = fetch_shlwapi_ordinal(243)))
return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
}
/******************************************************************
- * StopWatchAFORWARD (SHDOCVW.@)
+ * StopWatchWFORWARD (SHDOCVW.@)
*/
-DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown,
+DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
DWORD dwMode, DWORD dwTimeStamp)
{
- static DWORD (WINAPI *p)(DWORD, LPCSTR, DWORD, DWORD, DWORD);
+ static DWORD (WINAPI *p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD);
if (p || (p = fetch_shlwapi_ordinal(244)))
return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
if (!PathIsURLW(ptr)) {
len = sizeof(buffer_in) / sizeof(buffer_in[0]);
buffer_in[0] = 0;
- hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME);
+ hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT);
TRACE("got 0x%x with %s\n", hr, debugstr_w(buffer_in));
- if (hr != S_OK) {
- /* when we can't guess the scheme, use the default scheme */
- len = sizeof(buffer_in) / sizeof(buffer_in[0]);
- hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_DEFAULT);
- }
-
if (hr == S_OK) {
/* we parsed the url to buffer_in */
ptr = buffer_in;
}
len = sizeof(buffer) / sizeof(buffer[0]);
- res = ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown);
+ ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown);
HeapFree(GetProcessHeap(), 0, urlW);
needed = WideCharToMultiByte(CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL);
return TRUE;
}
+
+/******************************************************************
+ * ResetProfileSharing (SHDOCVW.164)
+ */
+HRESULT WINAPI ResetProfileSharing(HWND hwnd)
+{
+ FIXME("(%p) stub\n", hwnd);
+ return E_NOTIMPL;
+}
+
+/******************************************************************
+ * InstallReg_RunDLL (SHDOCVW.@)
+ */
+void WINAPI InstallReg_RunDLL(HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show)
+{
+ FIXME("(%p %p %s %x)\n", hwnd, handle, debugstr_a(cmdline), show);
+}
+
+/******************************************************************
+ * DoFileDownload (SHDOCVW.@)
+ */
+BOOL WINAPI DoFileDownload(LPWSTR filename)
+{
+ FIXME("(%s) stub\n", debugstr_w(filename));
+ return FALSE;
+}