Index: trunk/src/shdocvw/LICENSE.TXT
===================================================================
--- trunk/src/shdocvw/LICENSE.TXT	(revision 4943)
+++ trunk/src/shdocvw/LICENSE.TXT	(revision 4943)
@@ -0,0 +1,28 @@
+$Id: LICENSE.TXT,v 1.1 2001-01-14 17:14:16 sandervl Exp $
+@c This is an additional Odin license agreement.
+@c It supercedes the main Odin license, but is only valid in 
+@c the source directory in which it is present.
+
+@c This file is processed by GNU's TeXinfo
+@c If you modify it or move it to another location, make sure that
+@c TeXinfo works (type `make' in directory documentation).
+
+Copyright (c) 1993-2000 the Wine project authors (see the file AUTHORS
+for a complete list)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: trunk/src/shdocvw/classinfo.c
===================================================================
--- trunk/src/shdocvw/classinfo.c	(revision 4943)
+++ trunk/src/shdocvw/classinfo.c	(revision 4943)
@@ -0,0 +1,153 @@
+/*
+ * Implementation of IProvideClassInfo interfaces for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IProvideClassInfo interface
+ *
+ * FIXME: Should we just pass in the IProvideClassInfo2 methods rather
+ *        reimplementing them here?
+ */
+
+static HRESULT WINAPI WBPCI_QueryInterface(LPPROVIDECLASSINFO iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPCI_AddRef(LPPROVIDECLASSINFO iface)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPCI_Release(LPPROVIDECLASSINFO iface)
+{
+    ICOM_THIS(IProvideClassInfoImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Return an ITypeInfo interface to retrieve type library info about
+ * this control.
+ */
+static HRESULT WINAPI WBPCI_GetClassInfo(LPPROVIDECLASSINFO iface, LPTYPEINFO *ppTI)
+{
+    FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IProvideClassInfo virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IProvideClassInfo) WBPCI_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPCI_QueryInterface,
+    WBPCI_AddRef,
+    WBPCI_Release,
+    WBPCI_GetClassInfo
+};
+
+IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IProvideClassInfo2 interface (inherits from
+ * IProvideClassInfo).
+ */
+
+static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,
+                                            REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)
+{
+    ICOM_THIS(IProvideClassInfo2Impl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Return an ITypeInfo interface to retrieve type library info about
+ * this control.
+ */
+static HRESULT WINAPI WBPCI2_GetClassInfo(LPPROVIDECLASSINFO2 iface, LPTYPEINFO *ppTI)
+{
+    FIXME("stub: LPTYPEINFO = %p\n", *ppTI);
+    return S_OK;
+}
+
+/* Get the IID for generic default event callbacks.  This IID will
+ * in theory be used to later query for an IConnectionPoint to connect
+ * an event sink (callback implmentation in the OLE control site)
+ * to this control.
+*/
+static HRESULT WINAPI WBPCI2_GetGUID(LPPROVIDECLASSINFO2 iface,
+                                     DWORD dwGuidKind, GUID *pGUID)
+{
+    FIXME("stub: dwGuidKind = %ld, pGUID = %s\n", dwGuidKind, debugstr_guid(pGUID));
+
+    if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID)
+    {
+        FIXME ("Requested unsupported GUID type: %ld\n", dwGuidKind);
+        return E_FAIL;  /* Is there a better return type here? */
+    }
+
+    /* FIXME: Returning IPropertyNotifySink interface, but should really
+     * return a more generic event set (???) dispinterface.
+     * However, this hack, allows a control site to return with success
+     * (MFC's COleControlSite falls back to older IProvideClassInfo interface
+     * if GetGUID() fails to return a non-NULL GUID).
+     */
+    memcpy(pGUID, &IID_IPropertyNotifySink, sizeof(GUID));
+    FIXME("Wrongly returning IPropertyNotifySink interface %s\n",
+          debugstr_guid(pGUID));
+
+    return S_OK;
+}
+
+/**********************************************************************
+ * IProvideClassInfo virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IProvideClassInfo2) WBPCI2_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPCI2_QueryInterface,
+    WBPCI2_AddRef,
+    WBPCI2_Release,
+    WBPCI2_GetClassInfo,
+    WBPCI2_GetGUID
+};
+
+IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl, 1 };
Index: trunk/src/shdocvw/events.c
===================================================================
--- trunk/src/shdocvw/events.c	(revision 4943)
+++ trunk/src/shdocvw/events.c	(revision 4943)
@@ -0,0 +1,196 @@
+/*
+ * Implementation of event-related interfaces for IE Web Browser control:
+ *
+ *  - IConnectionPointContainer
+ *  - IConnectionPoint
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+
+/**********************************************************************
+ * Implement the IConnectionPointContainer interface
+ */
+
+static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)
+{
+    ICOM_THIS(IConnectionPointContainerImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Get a list of connection points inside this container. */
+static HRESULT WINAPI WBCPC_EnumConnectionPoints(LPCONNECTIONPOINTCONTAINER iface,
+                                                 LPENUMCONNECTIONPOINTS *ppEnum)
+{
+    FIXME("stub: IEnumConnectionPoints = %p\n", *ppEnum);
+    return S_OK;
+}
+
+/* Retrieve the connection point in this container associated with the
+ * riid interface.  When events occur in the control, the control can
+ * call backwards into its embedding site, through these interfaces.
+ */
+static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface,
+                                                REFIID riid, LPCONNECTIONPOINT *ppCP)
+{
+    TRACE(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP);
+
+    /* For now, return the same IConnectionPoint object for both
+     * event interface requests.
+     */
+    if (IsEqualGUID (&IID_INotifyDBEvents, riid))
+    {
+        TRACE("Returning connection point %p for IID_INotifyDBEvents\n",
+              &SHDOCVW_ConnectionPoint);
+        *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IPropertyNotifySink, riid))
+    {
+        TRACE("Returning connection point %p for IID_IPropertyNotifySink\n",
+              &SHDOCVW_ConnectionPoint);
+        *ppCP = (LPCONNECTIONPOINT)&SHDOCVW_ConnectionPoint;
+        return S_OK;
+    }
+
+    return E_FAIL;
+}
+
+/**********************************************************************
+ * IConnectionPointContainer virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IConnectionPointContainer) WBCPC_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCPC_QueryInterface,
+    WBCPC_AddRef,
+    WBCPC_Release,
+    WBCPC_EnumConnectionPoints,
+    WBCPC_FindConnectionPoint
+};
+
+IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = { &WBCPC_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IConnectionPoint interface
+ */
+
+static HRESULT WINAPI WBCP_QueryInterface(LPCONNECTIONPOINT iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBCP_AddRef(LPCONNECTIONPOINT iface)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBCP_Release(LPCONNECTIONPOINT iface)
+{
+    ICOM_THIS(IConnectionPointImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBCP_GetConnectionInterface(LPCONNECTIONPOINT iface, IID* pIId)
+{
+    FIXME("stub: %s\n", debugstr_guid(pIId));
+    return S_OK;
+}
+
+/* Get this connection point's owning container */
+static HRESULT WINAPI
+WBCP_GetConnectionPointContainer(LPCONNECTIONPOINT iface,
+                                 LPCONNECTIONPOINTCONTAINER *ppCPC)
+{
+    FIXME("stub: IConnectionPointContainer = %p\n", *ppCPC);
+    return S_OK;
+}
+
+/* Connect the pUnkSink event-handling implementation (in the control site)
+ * to this connection point.  Return a handle to this connection in
+ * pdwCookie (for later use in Unadvise()).
+ */
+static HRESULT WINAPI WBCP_Advise(LPCONNECTIONPOINT iface,
+                                  LPUNKNOWN pUnkSink, DWORD *pdwCookie)
+{
+    static int new_cookie;
+
+    FIXME("stub: IUnknown = %p, connection cookie = %ld\n", pUnkSink, *pdwCookie);
+
+    *pdwCookie = ++new_cookie;
+    TRACE ("Returning cookie = %ld\n", *pdwCookie);
+
+    return S_OK;
+}
+
+/* Disconnect this implementation from the connection point. */
+static HRESULT WINAPI WBCP_Unadvise(LPCONNECTIONPOINT iface,
+                                    DWORD dwCookie)
+{
+    FIXME("stub: cookie to disconnect = %ld\n", dwCookie);
+    return S_OK;
+}
+
+/* Get a list of connections in this connection point. */
+static HRESULT WINAPI WBCP_EnumConnections(LPCONNECTIONPOINT iface,
+                                           LPENUMCONNECTIONS *ppEnum)
+{
+    FIXME("stub: IEnumConnections = %p\n", *ppEnum);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IConnectionPoint virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IConnectionPoint) WBCP_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCP_QueryInterface,
+    WBCP_AddRef,
+    WBCP_Release,
+    WBCP_GetConnectionInterface,
+    WBCP_GetConnectionPointContainer,
+    WBCP_Advise,
+    WBCP_Unadvise,
+    WBCP_EnumConnections
+};
+
+IConnectionPointImpl SHDOCVW_ConnectionPoint = { &WBCP_Vtbl, 1 };
Index: trunk/src/shdocvw/factory.c
===================================================================
--- trunk/src/shdocvw/factory.c	(revision 4943)
+++ trunk/src/shdocvw/factory.c	(revision 4943)
@@ -0,0 +1,107 @@
+/*
+ * Implementation of class factory for IE Web Browser
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IWebBrowser class factory
+ *
+ * (Based on implementation in ddraw/main.c)
+ */
+
+/**********************************************************************
+ * WBCF_QueryInterface (IUnknown)
+ */
+static HRESULT WINAPI WBCF_QueryInterface(LPCLASSFACTORY iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    TRACE ("\n");
+
+    /*
+     * Perform a sanity check on the parameters.
+     */
+    if ((This == NULL) || (ppobj == NULL) )
+        return E_INVALIDARG;
+
+    return E_NOINTERFACE;
+}
+
+/************************************************************************
+ * WBCF_AddRef (IUnknown)
+ */
+static ULONG WINAPI WBCF_AddRef(LPCLASSFACTORY iface)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+/************************************************************************
+ * WBCF_Release (IUnknown)
+ */
+static ULONG WINAPI WBCF_Release(LPCLASSFACTORY iface)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/************************************************************************
+ * WBCF_CreateInstance (IClassFactory)
+ */
+static HRESULT WINAPI WBCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+
+    /* Don't support aggregation (yet?) */
+    if (pOuter)
+    {
+        TRACE ("Failed attempt to aggregate IWebBrowser\n");
+        return CLASS_E_NOAGGREGATION;
+    }
+
+    TRACE("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
+
+    if ((IsEqualGUID (&IID_IOleObject, riid)))
+    {
+        TRACE ("Instantiating IOleObject component\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleObject;
+
+        return S_OK;
+    }
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/************************************************************************
+ * WBCF_LockServer (IClassFactory)
+ */
+static HRESULT WINAPI WBCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
+{
+    ICOM_THIS(IClassFactoryImpl, iface);
+    FIXME("(%p)->(%d),stub!\n", This, dolock);
+    return S_OK;
+}
+
+static ICOM_VTABLE(IClassFactory) WBCF_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBCF_QueryInterface,
+    WBCF_AddRef,
+    WBCF_Release,
+    WBCF_CreateInstance,
+    WBCF_LockServer
+};
+
+IClassFactoryImpl SHDOCVW_ClassFactory = { &WBCF_Vtbl, 1 };
Index: trunk/src/shdocvw/makefile
===================================================================
--- trunk/src/shdocvw/makefile	(revision 4943)
+++ trunk/src/shdocvw/makefile	(revision 4943)
@@ -0,0 +1,53 @@
+# $Id: makefile,v 1.1 2001-01-14 17:14:16 sandervl Exp $
+
+#
+# Odin32 API
+#
+#       shdocvw.dll makefile
+#
+
+
+#
+# Compiler, tools, and interference rules.
+#
+!include ../../makefile.inc
+
+
+#
+# Object files. Prefix with OBJDIR and one space before the '\'.
+#
+OBJS = \
+$(OBJDIR)\classinfo.obj \
+$(OBJDIR)\events.obj \
+$(OBJDIR)\factory.obj \
+$(OBJDIR)\oleobject.obj \
+$(OBJDIR)\misc.obj \
+$(OBJDIR)\persist.obj \
+$(OBJDIR)\shdocvw_main.obj \
+$(OBJDIR)\shdocvwrsrc.obj \
+$(OBJDIR)\webbrowser.obj \
+$(DLLENTRY)
+
+
+#
+# Libraries. One space before the '\'.
+#
+LIBS = \
+$(ODIN32_LIB)/kernel32.lib \
+$(ODIN32_LIB)/ole32.lib \
+$(ODIN32_LIB)/$(ODINCRT).lib \
+OS2386.LIB \
+$(RTLLIB_O)
+
+
+#
+# Target name - name of the dll without extention and path.
+#
+TARGET = shdocvw
+
+
+#
+# Includes the common rules.
+#
+!include $(ODIN32_POST_INC)
+
Index: trunk/src/shdocvw/misc.c
===================================================================
--- trunk/src/shdocvw/misc.c	(revision 4943)
+++ trunk/src/shdocvw/misc.c	(revision 4943)
@@ -0,0 +1,80 @@
+/*
+ * Implementation of miscellaneous interfaces for IE Web Browser control:
+ *
+ *  - IQuickActivate
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IQuickActivate interface
+ */
+
+static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)
+{
+    ICOM_THIS(IQuickActivateImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* Alternative interface for quicker, easier activation of a control. */
+static HRESULT WINAPI WBQA_QuickActivate(LPQUICKACTIVATE iface,
+                                         QACONTAINER *pQaContainer,
+                                         QACONTROL *pQaControl)
+{
+    FIXME("stub: QACONTAINER = %p, QACONTROL = %p\n", pQaContainer, pQaControl);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBQA_SetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
+{
+    FIXME("stub: LPSIZEL = %p\n", pSizel);
+    return E_NOINTERFACE;
+}
+
+static HRESULT WINAPI WBQA_GetContentExtent(LPQUICKACTIVATE iface, LPSIZEL pSizel)
+{
+    FIXME("stub: LPSIZEL = %p\n", pSizel);
+    return E_NOINTERFACE;
+}
+
+/**********************************************************************
+ * IQuickActivate virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IQuickActivate) WBQA_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBQA_QueryInterface,
+    WBQA_AddRef,
+    WBQA_Release,
+    WBQA_QuickActivate,
+    WBQA_SetContentExtent,
+    WBQA_GetContentExtent
+};
+
+IQuickActivateImpl SHDOCVW_QuickActivate = { &WBQA_Vtbl, 1 };
Index: trunk/src/shdocvw/oleobject.c
===================================================================
--- trunk/src/shdocvw/oleobject.c	(revision 4943)
+++ trunk/src/shdocvw/oleobject.c	(revision 4943)
@@ -0,0 +1,603 @@
+/*
+ * Implementation of IOleObject interfaces for IE Web Browser
+ *
+ * - IOleObject
+ * - IOleInPlaceObject
+ * - IOleControl
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+#include "ole2.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IOleObject interface for the web browser component
+ *
+ * Based on DefaultHandler code in dlls/ole32/defaulthandler.c.
+ */
+
+static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface);
+static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface);
+
+/************************************************************************
+ * WBOOBJ_QueryInterface (IUnknown)
+ *
+ * Interfaces we need to (at least pretend to) retrieve:
+ *
+ *   a6bc3ac0-dbaa-11ce-9de3-00aa004bb851  IID_IProvideClassInfo2
+ *   b196b283-bab4-101a-b69c-00aa00341d07  IID_IProvideClassInfo
+ *   cf51ed10-62fe-11cf-bf86-00a0c9034836  IID_IQuickActivate
+ *   7fd52380-4e07-101b-ae2d-08002b2ec713  IID_IPersistStreamInit
+ *   0000010a-0000-0000-c000-000000000046  IID_IPersistStorage
+ *   b196b284-bab4-101a-b69c-00aa00341d07  IID_IConnectionPointContainer
+ */
+static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
+                                            REFIID riid, void** ppobj)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    /*
+     * Perform a sanity check on the parameters.
+     */
+    if ((This == NULL) || (ppobj == NULL) )
+        return E_INVALIDARG;
+
+    if (IsEqualGUID (&IID_IPersistStorage, riid))
+    {
+        TRACE("Returning IID_IPersistStorage interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_PersistStorage;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IPersistStreamInit, riid))
+    {
+        TRACE("Returning IID_IPersistStreamInit interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_PersistStreamInit;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IProvideClassInfo, riid))
+    {
+        TRACE("Returning IID_IProvideClassInfo interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IProvideClassInfo2, riid))
+    {
+        TRACE("Returning IID_IProvideClassInfo2 interface %p\n",
+              &SHDOCVW_ProvideClassInfo2);
+        *ppobj = (LPVOID)&SHDOCVW_ProvideClassInfo2;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IQuickActivate, riid))
+    {
+        TRACE("Returning IID_IQuickActivate interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_QuickActivate;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IConnectionPointContainer, riid))
+    {
+        TRACE("Returning IID_IConnectionPointContainer interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_ConnectionPointContainer;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IOleInPlaceObject, riid))
+    {
+        TRACE("Returning IID_IOleInPlaceObject interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleInPlaceObject;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IOleControl, riid))
+    {
+        TRACE("Returning IID_IOleControl interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_OleControl;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IWebBrowser, riid))
+    {
+        TRACE("Returning IID_IWebBrowser interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+    else if (IsEqualGUID (&IID_IDispatch, riid))
+    {
+        TRACE("Returning IID_IDispatch interface\n");
+        *ppobj = (LPVOID)&SHDOCVW_WebBrowser;
+        WBOOBJ_AddRef (iface);
+        return S_OK;
+    }
+
+    TRACE ("Failed to find iid = %s\n", debugstr_guid(riid));
+
+    return E_NOINTERFACE;
+}
+
+/************************************************************************
+ * WBOOBJ_AddRef (IUnknown)
+ */
+static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+/************************************************************************
+ * WBOOBJ_Release (IUnknown)
+ */
+static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)
+{
+    ICOM_THIS(IOleObjectImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/************************************************************************
+ * WBOOBJ_SetClientSite (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetClientSite(LPOLEOBJECT iface,
+                                           LPOLECLIENTSITE pClientSite)
+{
+    FIXME("stub: (%p, %p)\n", iface, pClientSite);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetClientSite (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetClientSite(LPOLEOBJECT iface,
+                                           LPOLECLIENTSITE* ppClientSite)
+{
+    FIXME("stub: (%p)\n", *ppClientSite);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetHostNames (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetHostNames(LPOLEOBJECT iface, LPCOLESTR szContainerApp,
+                                          LPCOLESTR szContainerObj)
+{
+    FIXME("stub: (%p, %s, %s)\n", iface, debugstr_w(szContainerApp),
+          debugstr_w(szContainerObj));
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Close (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Close(LPOLEOBJECT iface, DWORD dwSaveOption)
+{
+    FIXME("stub: ()\n");
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetMoniker (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_SetMoniker(LPOLEOBJECT iface,
+                                        DWORD dwWhichMoniker, IMoniker* pmk)
+{
+    FIXME("stub: (%p, %ld, %p)\n", iface, dwWhichMoniker, pmk);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetMoniker (IOleObject)
+ *
+ * Delegate this request to the client site if we have one.
+ */
+static HRESULT WINAPI WBOOBJ_GetMoniker(LPOLEOBJECT iface, DWORD dwAssign,
+                                        DWORD dwWhichMoniker, LPMONIKER *ppmk)
+{
+    FIXME("stub (%p, %ld, %ld, %p)\n", iface, dwAssign, dwWhichMoniker, ppmk);
+    return E_UNSPEC;
+}
+
+/************************************************************************
+ * WBOOBJ_InitFromData (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_InitFromData(LPOLEOBJECT iface, LPDATAOBJECT pDataObject,
+                                          BOOL fCreation, DWORD dwReserved)
+{
+    FIXME("stub: (%p, %p, %d, %ld)\n", iface, pDataObject, fCreation, dwReserved);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetClipboardData (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_GetClipboardData(LPOLEOBJECT iface, DWORD dwReserved,
+                                              LPDATAOBJECT *ppDataObject)
+{
+    FIXME("stub: (%p, %ld, %p)\n", iface, dwReserved, ppDataObject);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_DoVerb (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_DoVerb(LPOLEOBJECT iface, LONG iVerb, struct tagMSG* lpmsg,
+                                    LPOLECLIENTSITE pActiveSite, LONG lindex,
+                                    HWND hwndParent, LPCRECT lprcPosRect)
+{
+    FIXME(": stub iVerb = %ld\n", iVerb);
+    switch (iVerb)
+    {
+    case OLEIVERB_INPLACEACTIVATE:
+        FIXME ("stub for OLEIVERB_INPLACEACTIVATE\n");
+        break;
+    case OLEIVERB_HIDE:
+        FIXME ("stub for OLEIVERB_HIDE\n");
+        break;
+    }
+
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_EnumVerbs (IOleObject)
+ *
+ * Delegate to OleRegEnumVerbs.
+ */
+static HRESULT WINAPI WBOOBJ_EnumVerbs(LPOLEOBJECT iface,
+                                       IEnumOLEVERB** ppEnumOleVerb)
+{
+    TRACE("(%p, %p)\n", iface, ppEnumOleVerb);
+
+    return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb);
+}
+
+/************************************************************************
+ * WBOOBJ_EnumVerbs (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Update(LPOLEOBJECT iface)
+{
+    FIXME(": Stub\n");
+    return E_NOTIMPL;
+}
+
+/************************************************************************
+ * WBOOBJ_IsUpToDate (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_IsUpToDate(LPOLEOBJECT iface)
+{
+    FIXME("(%p)\n", iface);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetUserClassID (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetUserClassID(LPOLEOBJECT iface, CLSID* pClsid)
+{
+    FIXME("stub: (%p, %p)\n", iface, pClsid);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetUserType (IOleObject)
+ *
+ * Delegate to OleRegGetUserType.
+ */
+static HRESULT WINAPI WBOOBJ_GetUserType(LPOLEOBJECT iface, DWORD dwFormOfType,
+                                         LPOLESTR* pszUserType)
+{
+    TRACE("(%p, %ld, %p)\n", iface, dwFormOfType, pszUserType);
+
+    return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType);
+}
+
+/************************************************************************
+ * WBOOBJ_SetExtent (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_SetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
+                                       SIZEL* psizel)
+{
+    FIXME("stub: (%p, %lx, (%ld x %ld))\n", iface, dwDrawAspect,
+          psizel->cx, psizel->cy);
+    return OLE_E_NOTRUNNING;
+}
+
+/************************************************************************
+ * WBOOBJ_GetExtent (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_GetExtent(LPOLEOBJECT iface, DWORD dwDrawAspect,
+                                       SIZEL* psizel)
+{
+    FIXME("stub: (%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Advise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Advise(LPOLEOBJECT iface, IAdviseSink* pAdvSink,
+                                    DWORD* pdwConnection)
+{
+    FIXME("stub: (%p, %p, %p)\n", iface, pAdvSink, pdwConnection);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_Unadvise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_Unadvise(LPOLEOBJECT iface, DWORD dwConnection)
+{
+    FIXME("stub: (%p, %ld)\n", iface, dwConnection);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_EnumAdvise (IOleObject)
+ */
+static HRESULT WINAPI WBOOBJ_EnumAdvise(LPOLEOBJECT iface, IEnumSTATDATA** ppenumAdvise)
+{
+    FIXME("stub: (%p, %p)\n", iface, ppenumAdvise);
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_GetMiscStatus (IOleObject)
+ *
+ * Delegate to OleRegGetMiscStatus.
+ */
+static HRESULT WINAPI WBOOBJ_GetMiscStatus(LPOLEOBJECT iface, DWORD dwAspect,
+                                           DWORD* pdwStatus)
+{
+    HRESULT hres;
+
+    TRACE("(%p, %lx, %p)\n", iface, dwAspect, pdwStatus);
+
+    hres = OleRegGetMiscStatus(&CLSID_WebBrowser, dwAspect, pdwStatus);
+
+    if (FAILED(hres))
+        *pdwStatus = 0;
+
+    return S_OK;
+}
+
+/************************************************************************
+ * WBOOBJ_SetColorScheme (IOleObject)
+ *
+ * This method is meaningless if the server is not running
+ */
+static HRESULT WINAPI WBOOBJ_SetColorScheme(LPOLEOBJECT iface,
+                                            struct tagLOGPALETTE* pLogpal)
+{
+    FIXME("stub: (%p, %p))\n", iface, pLogpal);
+    return OLE_E_NOTRUNNING;
+}
+
+/**********************************************************************
+ * IOleObject virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleObject) WBOOBJ_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOOBJ_QueryInterface,
+    WBOOBJ_AddRef,
+    WBOOBJ_Release,
+    WBOOBJ_SetClientSite,
+    WBOOBJ_GetClientSite,
+    WBOOBJ_SetHostNames,
+    WBOOBJ_Close,
+    WBOOBJ_SetMoniker,
+    WBOOBJ_GetMoniker,
+    WBOOBJ_InitFromData,
+    WBOOBJ_GetClipboardData,
+    WBOOBJ_DoVerb,
+    WBOOBJ_EnumVerbs,
+    WBOOBJ_Update,
+    WBOOBJ_IsUpToDate,
+    WBOOBJ_GetUserClassID,
+    WBOOBJ_GetUserType,
+    WBOOBJ_SetExtent,
+    WBOOBJ_GetExtent,
+    WBOOBJ_Advise,
+    WBOOBJ_Unadvise,
+    WBOOBJ_EnumAdvise,
+    WBOOBJ_GetMiscStatus,
+    WBOOBJ_SetColorScheme
+};
+
+IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IOleInPlaceObject interface
+ */
+
+static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,
+                                            REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)
+{
+    ICOM_THIS(IOleInPlaceObjectImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)
+{
+#if 0
+    /* Create a fake window to fool MFC into believing that we actually
+     * have an implemented browser control.  Avoids the assertion.
+     */
+    HWND hwnd;
+    hwnd = CreateWindowA("BUTTON", "Web Control",
+                        WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW,
+                        CW_USEDEFAULT, CW_USEDEFAULT, 600,
+                        400, NULL, NULL, NULL, NULL);
+
+    *phwnd = hwnd;
+    TRACE ("Returning hwnd = %d\n", hwnd);
+#endif
+
+    FIXME("stub HWND* = %p\n", phwnd);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_ContextSensitiveHelp(LPOLEINPLACEOBJECT iface,
+                                                  BOOL fEnterMode)
+{
+    FIXME("stub fEnterMode = %d\n", fEnterMode);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_InPlaceDeactivate(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_UIDeactivate(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_SetObjectRects(LPOLEINPLACEOBJECT iface,
+                                            LPCRECT lprcPosRect, LPCRECT lprcClipRect)
+{
+    FIXME("stub PosRect = %p, ClipRect = %p\n", lprcPosRect, lprcClipRect);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOIPO_ReactivateAndUndo(LPOLEINPLACEOBJECT iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IOleInPlaceObject virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleInPlaceObject) WBOIPO_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOIPO_QueryInterface,
+    WBOIPO_AddRef,
+    WBOIPO_Release,
+    WBOIPO_GetWindow,
+    WBOIPO_ContextSensitiveHelp,
+    WBOIPO_InPlaceDeactivate,
+    WBOIPO_UIDeactivate,
+    WBOIPO_SetObjectRects,
+    WBOIPO_ReactivateAndUndo
+};
+
+IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IOleControl interface
+ */
+
+static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)
+{
+    ICOM_THIS(IOleControlImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)
+{
+    FIXME("stub: LPCONTROLINFO = %p\n", pCI);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_OnMnemonic(LPOLECONTROL iface, struct tagMSG *pMsg)
+{
+    FIXME("stub: MSG* = %p\n", pMsg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_OnAmbientPropertyChange(LPOLECONTROL iface, DISPID dispID)
+{
+    FIXME("stub: DISPID = %ld\n", dispID);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBOC_FreezeEvents(LPOLECONTROL iface, BOOL bFreeze)
+{
+    FIXME("stub: bFreeze = %d\n", bFreeze);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IOleControl virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IOleControl) WBOC_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBOC_QueryInterface,
+    WBOC_AddRef,
+    WBOC_Release,
+    WBOC_GetControlInfo,
+    WBOC_OnMnemonic,
+    WBOC_OnAmbientPropertyChange,
+    WBOC_FreezeEvents
+};
+
+IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };
Index: trunk/src/shdocvw/persist.c
===================================================================
--- trunk/src/shdocvw/persist.c	(revision 4943)
+++ trunk/src/shdocvw/persist.c	(revision 4943)
@@ -0,0 +1,186 @@
+/*
+ * Implementation of IPersist interfaces for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IPersistStorage interface
+ */
+
+static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,
+                                          REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)
+{
+    ICOM_THIS(IPersistStorageImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)
+{
+    FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_IsDirty(LPPERSISTSTORAGE iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_InitNew(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_Load(LPPERSISTSTORAGE iface, LPSTORAGE pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_Save(LPPERSISTSTORAGE iface, LPSTORAGE pStg,
+                                BOOL fSameAsLoad)
+{
+    FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPS_SaveCompleted(LPPERSISTSTORAGE iface, LPSTORAGE pStgNew)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStgNew);
+    return S_OK;
+}
+
+/**********************************************************************
+ * IPersistStorage virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IPersistStorage) WBPS_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPS_QueryInterface,
+    WBPS_AddRef,
+    WBPS_Release,
+    WBPS_GetClassID,
+    WBPS_IsDirty,
+    WBPS_InitNew,
+    WBPS_Load,
+    WBPS_Save,
+    WBPS_SaveCompleted
+};
+
+IPersistStorageImpl SHDOCVW_PersistStorage = { &WBPS_Vtbl, 1 };
+
+
+/**********************************************************************
+ * Implement the IPersistStreamInit interface
+ */
+
+static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,
+                                           REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)
+{
+    ICOM_THIS(IPersistStreamInitImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)
+{
+    FIXME("stub: CLSID = %s\n", debugstr_guid(pClassID));
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_IsDirty(LPPERSISTSTREAMINIT iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_Load(LPPERSISTSTREAMINIT iface, LPSTREAM pStg)
+{
+    FIXME("stub: LPSTORAGE = %p\n", pStg);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_Save(LPPERSISTSTREAMINIT iface, LPSTREAM pStg,
+                                BOOL fSameAsLoad)
+{
+    FIXME("stub: LPSTORAGE = %p, fSameAsLoad = %d\n", pStg, fSameAsLoad);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_GetSizeMax(LPPERSISTSTREAMINIT iface,
+                                       ULARGE_INTEGER *pcbSize)
+{
+    FIXME("stub: ULARGE_INTEGER = %p\n", pcbSize);
+    return S_OK;
+}
+
+static HRESULT WINAPI WBPSI_InitNew(LPPERSISTSTREAMINIT iface)
+{
+    FIXME("stub\n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IPersistStreamInit virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IPersistStreamInit) WBPSI_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WBPSI_QueryInterface,
+    WBPSI_AddRef,
+    WBPSI_Release,
+    WBPSI_GetClassID,
+    WBPSI_IsDirty,
+    WBPSI_Load,
+    WBPSI_Save,
+    WBPSI_GetSizeMax,
+    WBPSI_InitNew
+};
+
+IPersistStreamInitImpl SHDOCVW_PersistStreamInit = { &WBPSI_Vtbl, 1 };
Index: trunk/src/shdocvw/shdocvw.def
===================================================================
--- trunk/src/shdocvw/shdocvw.def	(revision 4943)
+++ trunk/src/shdocvw/shdocvw.def	(revision 4943)
@@ -0,0 +1,33 @@
+LIBRARY SHDOCVW INITINSTANCE TERMINSTANCE
+DESCRIPTION 'Odin SHDOCVW.DLL'
+DATA MULTIPLE NONSHARED
+
+EXPORTS
+
+  DllCanUnloadNow     = _SHDOCVW_DllCanUnloadNow@0          @108
+  DllGetClassObject   = _SHDOCVW_DllGetClassObject@12       @312
+  DllGetVersion       = _SHDOCVW_DllGetVersion@4            @113
+  DllInstall          = _SHDOCVW_DllInstall@8               @114
+  DllRegisterServer   = _SHDOCVW_DllRegisterServer@0        @124
+  DllUnregisterServer = _SHDOCVW_DllUnregisterServer@0      @127
+
+;108 stub AddUrlToFavorites
+;126 stub DllRegisterWindowClasses
+;128 stub DoAddToFavDlg
+;129 stub DoAddToFavDlgW
+;132 stub DoFileDownload
+;133 stub DoFileDownloadEx
+;134 stub DoOrganizeFavDlg
+;144 stub DoOrganizeFavDlgW
+;106 stub HlinkFindFrame
+;155 stub HlinkFrameNavigate
+;155 stub HlinkFrameNavigateNHL
+;156 stub IEWriteErrorLog
+;157 stub OpenURL
+;163 stub SHAddSubscribeFavorite
+;166 stub SHGetIDispatchForFolder
+;168 stub SetQueryNetSessionCount
+;107 stub SetShellOfflineState
+;182 stub SoftwareUpdateMessageBox
+;184 stub URLQualifyA
+;186 stub URLQualifyW
Index: trunk/src/shdocvw/shdocvw.h
===================================================================
--- trunk/src/shdocvw/shdocvw.h	(revision 4943)
+++ trunk/src/shdocvw/shdocvw.h	(revision 4943)
@@ -0,0 +1,197 @@
+/*
+ * Header includes for shdocvw.dll
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#ifndef __WINE_SHDOCVW_H
+#define __WINE_SHDOCVW_H
+
+/* FIXME: Is there a better way to deal with all these includes? */
+#include "wingdi.h"
+#include "winbase.h"
+#include "winuser.h"
+
+#include "wine/obj_base.h"
+#include "wine/obj_storage.h"
+#include "wine/obj_misc.h"
+#include "wine/obj_moniker.h"
+#include "wine/obj_inplace.h"
+#include "wine/obj_dataobject.h"
+#include "wine/obj_oleobj.h"
+#include "wine/obj_oleaut.h"
+#include "wine/obj_olefont.h"
+#include "wine/obj_dragdrop.h"
+#include "wine/obj_oleview.h"
+#include "wine/obj_control.h"
+#include "wine/obj_connection.h"
+#include "wine/obj_property.h"
+#include "wine/obj_oleundo.h"
+#include "wine/obj_webbrowser.h"
+
+#ifdef __WIN32OS2__
+#include <win\winerror.h>
+#endif
+
+/**********************************************************************
+ * IClassFactory declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IClassFactory);
+    DWORD ref;
+} IClassFactoryImpl;
+
+extern IClassFactoryImpl SHDOCVW_ClassFactory;
+
+
+/**********************************************************************
+ * IOleObject declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleObject);
+    DWORD ref;
+} IOleObjectImpl;
+
+extern IOleObjectImpl SHDOCVW_OleObject;
+
+
+/**********************************************************************
+ * IOleInPlaceObject declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleInPlaceObject);
+    DWORD ref;
+} IOleInPlaceObjectImpl;
+
+extern IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject;
+
+
+/**********************************************************************
+ * IOleControl declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IOleControl);
+    DWORD ref;
+} IOleControlImpl;
+
+extern IOleControlImpl SHDOCVW_OleControl;
+
+
+/**********************************************************************
+ * IWebBrowser declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IWebBrowser);
+    DWORD ref;
+} IWebBrowserImpl;
+
+extern IWebBrowserImpl SHDOCVW_WebBrowser;
+
+
+/**********************************************************************
+ * IProvideClassInfo declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IProvideClassInfo);
+    DWORD ref;
+} IProvideClassInfoImpl;
+
+extern IProvideClassInfoImpl SHDOCVW_ProvideClassInfo;
+
+
+/**********************************************************************
+ * IProvideClassInfo2 declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IProvideClassInfo2);
+    DWORD ref;
+} IProvideClassInfo2Impl;
+
+extern IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2;
+
+
+/**********************************************************************
+ * IPersistStorage declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IPersistStorage);
+    DWORD ref;
+} IPersistStorageImpl;
+
+extern IPersistStorageImpl SHDOCVW_PersistStorage;
+
+
+/**********************************************************************
+ * IPersistStreamInit declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IPersistStreamInit);
+    DWORD ref;
+} IPersistStreamInitImpl;
+
+extern IPersistStreamInitImpl SHDOCVW_PersistStreamInit;
+
+
+/**********************************************************************
+ * IQuickActivate declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IQuickActivate);
+    DWORD ref;
+} IQuickActivateImpl;
+
+extern IQuickActivateImpl SHDOCVW_QuickActivate;
+
+
+/**********************************************************************
+ * IConnectionPointContainer declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IConnectionPointContainer);
+    DWORD ref;
+} IConnectionPointContainerImpl;
+
+extern IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer;
+
+
+/**********************************************************************
+ * IConnectionPoint declaration for SHDOCVW.DLL
+ */
+typedef struct
+{
+    /* IUnknown fields */
+    ICOM_VFIELD(IConnectionPoint);
+    DWORD ref;
+} IConnectionPointImpl;
+
+extern IConnectionPointImpl SHDOCVW_ConnectionPoint;
+
+
+/* Other stuff.. */
+
+DEFINE_GUID(IID_INotifyDBEvents,
+0xdb526cc0, 0xd188, 0x11cd, 0xad, 0x48, 0x0, 0xaa, 0x0, 0x3c, 0x9c, 0xb6);
+
+#endif /* __WINE_SHDOCVW_H */
Index: trunk/src/shdocvw/shdocvw_main.c
===================================================================
--- trunk/src/shdocvw/shdocvw_main.c	(revision 4943)
+++ trunk/src/shdocvw/shdocvw_main.c	(revision 4943)
@@ -0,0 +1,84 @@
+/*
+ * SHDOCVW - Internet Explorer Web Control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+#ifdef __WIN32OS2__
+#define INITGUID
+#endif
+
+#include "debugtools.h"
+
+#include "initguid.h"
+#include "ole2.h"
+#include "shlwapi.h"
+
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/***********************************************************************
+ *              DllCanUnloadNow (SHDOCVW.109) */
+HRESULT WINAPI SHDOCVW_DllCanUnloadNow(void)
+{
+    FIXME("(void): stub\n");
+
+    return S_FALSE;
+}
+
+/*************************************************************************
+ *              DllGetClassObject (SHDOCVW.312)
+ */
+HRESULT WINAPI SHDOCVW_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+    TRACE("\n");
+
+    if (IsEqualGUID(&IID_IClassFactory, riid))
+    {
+        /* Pass back our shdocvw class factory */
+        *ppv = (LPVOID)&SHDOCVW_ClassFactory;
+        IClassFactory_AddRef((IClassFactory*)&SHDOCVW_ClassFactory);
+
+        return S_OK;
+    }
+
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/***********************************************************************
+ *              DllGetVersion (SHDOCVW.113)
+ */
+HRESULT WINAPI SHDOCVW_DllGetVersion (DLLVERSIONINFO *pdvi)
+{
+    FIXME("(void): stub\n");
+    return S_FALSE;
+}
+
+/*************************************************************************
+ *              DllInstall (SHDOCVW.114)
+ */
+HRESULT WINAPI SHDOCVW_DllInstall(BOOL bInstall, LPCWSTR cmdline)
+{
+   FIXME("(%s, %s): stub!\n", bInstall ? "TRUE":"FALSE", debugstr_w(cmdline));
+
+   return S_OK;
+}
+
+/***********************************************************************
+ *		DllRegisterServer (SHDOCVW.124)
+ */
+HRESULT WINAPI SHDOCVW_DllRegisterServer()
+{
+    FIXME("(), stub!\n");
+    return S_OK;
+}
+
+/***********************************************************************
+ *		DllUnregisterServer (SHDOCVW.127)
+ */
+HRESULT WINAPI SHDOCVW_DllUnregisterServer()
+{
+    FIXME("(), stub!\n");
+    return S_OK;
+}
+
Index: trunk/src/shdocvw/shdocvwrsrc.orc
===================================================================
--- trunk/src/shdocvw/shdocvwrsrc.orc	(revision 4943)
+++ trunk/src/shdocvw/shdocvwrsrc.orc	(revision 4943)
@@ -0,0 +1,41 @@
+/* $Id: shdocvwrsrc.orc,v 1.1 2001-01-14 17:14:18 sandervl Exp $ */
+
+#include "winuser.h"
+#include "odinrsrc.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version (based on NT 4 SP6)
+//
+
+1 VERSIONINFO
+ FILEVERSION 0x04, 0x00, 0x0565, 0x0119
+ PRODUCTVERSION 0x04, 0x00, 0x0565, 0x0119
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0xaL
+ FILEOS 0x10001L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904E4"
+        BEGIN
+            VALUE "Comments", "Odin32 System Dll\0"
+            VALUE "CompanyName", "Odin Team\0"
+            VALUE "FileDescription", "ADVAPI32 System dll\0"
+            VALUE "FileVersion", "4.00\0"
+            VALUE "InternalName", "ADVAPI32\0"
+            VALUE "LegalCopyright", "Copyright (C) 1999-2000\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "ADVAPI32.DLL\0"
+            VALUE "ProductName", "Odin32 - ADVAPI32\0"
+            VALUE "ProductVersion", "4.00\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+	VALUE "Translation", 0x409, 0x04E4
+    END
+END
Index: trunk/src/shdocvw/webbrowser.c
===================================================================
--- trunk/src/shdocvw/webbrowser.c	(revision 4943)
+++ trunk/src/shdocvw/webbrowser.c	(revision 4943)
@@ -0,0 +1,267 @@
+/*
+ * Implementation of IWebBrowser interface for IE Web Browser control
+ *
+ * 2001 John R. Sheets (for CodeWeavers)
+ */
+
+#include "debugtools.h"
+#include "shdocvw.h"
+
+DEFAULT_DEBUG_CHANNEL(shdocvw);
+
+/**********************************************************************
+ * Implement the IWebBrowser interface
+ */
+
+static HRESULT WINAPI WB_QueryInterface(LPWEBBROWSER iface, REFIID riid, LPVOID *ppobj)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI WB_AddRef(LPWEBBROWSER iface)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    TRACE("\n");
+    return ++(This->ref);
+}
+
+static ULONG WINAPI WB_Release(LPWEBBROWSER iface)
+{
+    ICOM_THIS(IWebBrowserImpl, iface);
+
+    /* static class, won't be freed */
+    TRACE("\n");
+    return --(This->ref);
+}
+
+/* IDispatch methods */
+static HRESULT WINAPI WB_GetTypeInfoCount(LPWEBBROWSER iface, UINT *pctinfo)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GetTypeInfo(LPWEBBROWSER iface, UINT iTInfo, LCID lcid,
+                                     LPTYPEINFO *ppTInfo)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GetIDsOfNames(LPWEBBROWSER iface, REFIID riid,
+                                       LPOLESTR *rgszNames, UINT cNames,
+                                       LCID lcid, DISPID *rgDispId)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Invoke(LPWEBBROWSER iface, DISPID dispIdMember,
+                                REFIID riid, LCID lcid, WORD wFlags,
+                                DISPPARAMS *pDispParams, VARIANT *pVarResult,
+                                EXCEPINFO *pExepInfo, UINT *puArgErr)
+{
+    FIXME("stub dispIdMember = %d, IID = %s\n", (int)dispIdMember, debugstr_guid(riid));
+    return S_OK;
+}
+
+/* IWebBrowser methods */
+static HRESULT WINAPI WB_GoBack(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoForward(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoHome(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_GoSearch(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Navigate(LPWEBBROWSER iface, BSTR *URL,
+                                  VARIANT *Flags, VARIANT *TargetFrameName,
+                                  VARIANT *PostData, VARIANT *Headers)
+{
+    FIXME("stub: URL = %p (%p, %p, %p, %p)\n", URL, Flags, TargetFrameName,
+          PostData, Headers);
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Refresh(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Refresh2(LPWEBBROWSER iface, VARIANT *Level)
+{
+    FIXME("stub: %p\n", Level);
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_Stop(LPWEBBROWSER iface)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Application(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Parent(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Container(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Document(LPWEBBROWSER iface, LPVOID *ppDisp)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_TopLevelContainer(LPWEBBROWSER iface, VARIANT *pBool)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Type(LPWEBBROWSER iface, BSTR *Type)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Left(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Left(LPWEBBROWSER iface, long Left)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Top(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Top(LPWEBBROWSER iface, long Top)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Width(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Width(LPWEBBROWSER iface, long Width)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Height(LPWEBBROWSER iface, long *pl)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_put_Height(LPWEBBROWSER iface, long Height)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_LocationName(LPWEBBROWSER iface, BSTR *LocationName)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_LocationURL(LPWEBBROWSER iface, BSTR *LocationURL)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+static HRESULT WINAPI WB_get_Busy(LPWEBBROWSER iface, VARIANT *pBool)
+{
+    FIXME("stub \n");
+    return S_OK;
+}
+
+/**********************************************************************
+ * IWebBrowser virtual function table for IE Web Browser component
+ */
+
+static ICOM_VTABLE(IWebBrowser) WB_Vtbl = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    WB_QueryInterface,
+    WB_AddRef,
+    WB_Release,
+    WB_GetTypeInfoCount,
+    WB_GetTypeInfo,
+    WB_GetIDsOfNames,
+    WB_Invoke,
+    WB_GoBack,
+    WB_GoForward,
+    WB_GoHome,
+    WB_GoSearch,
+    WB_Navigate,
+    WB_Refresh,
+    WB_Refresh2,
+    WB_Stop,
+    WB_get_Application,
+    WB_get_Parent,
+    WB_get_Container,
+    WB_get_Document,
+    WB_get_TopLevelContainer,
+    WB_get_Type,
+    WB_get_Left,
+    WB_put_Left,
+    WB_get_Top,
+    WB_put_Top,
+    WB_get_Width,
+    WB_put_Width,
+    WB_get_Height,
+    WB_put_Height,
+    WB_get_LocationName,
+    WB_get_LocationURL,
+    WB_get_Busy
+};
+
+IWebBrowserImpl SHDOCVW_WebBrowser = { &WB_Vtbl, 1 };
