Sync to Wine-20050211
authorGé van Geldorp <ge@gse.nl>
Sun, 13 Feb 2005 23:10:36 +0000 (23:10 +0000)
committerGé van Geldorp <ge@gse.nl>
Sun, 13 Feb 2005 23:10:36 +0000 (23:10 +0000)
James Hawkins <truiken@gmail.com>
- Properly implement DllCanUnloadNow ref counting. Make sure the mozilla
  control is ready to unload as well.
- Use Interlocked* instead of ++/-- in AddRef/Release.
- Use only stored result of Interlocked* in AddRef/Release.
- Expand TRACEs to display the ref count.
Mike McCormack <mike@codeweavers.com>
- Stub definition for OpenUrl.

svn path=/trunk/; revision=13551

reactos/lib/shdocvw/classinfo.c
reactos/lib/shdocvw/events.c
reactos/lib/shdocvw/factory.c
reactos/lib/shdocvw/misc.c
reactos/lib/shdocvw/oleobject.c
reactos/lib/shdocvw/persist.c
reactos/lib/shdocvw/shdocvw.h
reactos/lib/shdocvw/shdocvw.spec
reactos/lib/shdocvw/shdocvw_main.c
reactos/lib/shdocvw/webbrowser.c

index e93218a..11f888e 100644 (file)
@@ -38,27 +38,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 static HRESULT WINAPI WBPCI_QueryInterface(LPPROVIDECLASSINFO iface,\r
                                            REFIID riid, LPVOID *ppobj)\r
 {\r
-    IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
+\r
+    if (ppobj == NULL) return E_POINTER;\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBPCI_AddRef(LPPROVIDECLASSINFO iface)\r
 {\r
-    IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBPCI_Release(LPPROVIDECLASSINFO iface)\r
 {\r
-    IProvideClassInfoImpl *This = (IProvideClassInfoImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /* Return an ITypeInfo interface to retrieve type library info about\r
@@ -82,7 +80,7 @@ static IProvideClassInfoVtbl WBPCI_Vtbl =
     WBPCI_GetClassInfo\r
 };\r
 \r
-IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl, 1 };\r
+IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl};\r
 \r
 \r
 /**********************************************************************\r
@@ -93,27 +91,25 @@ IProvideClassInfoImpl SHDOCVW_ProvideClassInfo = { &WBPCI_Vtbl, 1 };
 static HRESULT WINAPI WBPCI2_QueryInterface(LPPROVIDECLASSINFO2 iface,\r
                                             REFIID riid, LPVOID *ppobj)\r
 {\r
-    IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBPCI2_AddRef(LPPROVIDECLASSINFO2 iface)\r
 {\r
-    IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBPCI2_Release(LPPROVIDECLASSINFO2 iface)\r
 {\r
-    IProvideClassInfo2Impl *This = (IProvideClassInfo2Impl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /* Return an ITypeInfo interface to retrieve type library info about\r
@@ -167,4 +163,4 @@ static IProvideClassInfo2Vtbl WBPCI2_Vtbl =
     WBPCI2_GetGUID\r
 };\r
 \r
-IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl, 1 };\r
+IProvideClassInfo2Impl SHDOCVW_ProvideClassInfo2 = { &WBPCI2_Vtbl};\r
index 1a1b59d..df61124 100644 (file)
@@ -38,27 +38,25 @@ static const GUID IID_INotifyDBEvents =
 static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface,\r
                                            REFIID riid, LPVOID *ppobj)\r
 {\r
-    IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface)\r
 {\r
-    IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface)\r
 {\r
-    IConnectionPointContainerImpl *This = (IConnectionPointContainerImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /* Get a list of connection points inside this container. */\r
@@ -112,7 +110,7 @@ static IConnectionPointContainerVtbl WBCPC_Vtbl =
     WBCPC_FindConnectionPoint\r
 };\r
 \r
-IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = { &WBCPC_Vtbl, 1 };\r
+IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = {&WBCPC_Vtbl};\r
 \r
 \r
 /**********************************************************************\r
@@ -122,27 +120,25 @@ IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = { &WBCPC_Vtbl,
 static HRESULT WINAPI WBCP_QueryInterface(LPCONNECTIONPOINT iface,\r
                                           REFIID riid, LPVOID *ppobj)\r
 {\r
-    IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBCP_AddRef(LPCONNECTIONPOINT iface)\r
 {\r
-    IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBCP_Release(LPCONNECTIONPOINT iface)\r
 {\r
-    IConnectionPointImpl *This = (IConnectionPointImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 static HRESULT WINAPI WBCP_GetConnectionInterface(LPCONNECTIONPOINT iface, IID* pIId)\r
@@ -209,4 +205,4 @@ static IConnectionPointVtbl WBCP_Vtbl =
     WBCP_EnumConnections\r
 };\r
 \r
-IConnectionPointImpl SHDOCVW_ConnectionPoint = { &WBCP_Vtbl, 1 };\r
+IConnectionPointImpl SHDOCVW_ConnectionPoint = {&WBCP_Vtbl};\r
index c1f0be6..df00714 100644 (file)
@@ -36,16 +36,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 static HRESULT WINAPI WBCF_QueryInterface(LPCLASSFACTORY iface,\r
                                           REFIID riid, LPVOID *ppobj)\r
 {\r
-    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
-\r
-    TRACE ("\n");\r
-\r
-    /*\r
-     * Perform a sanity check on the parameters.\r
-     */\r
-    if ((This == NULL) || (ppobj == NULL) )\r
-        return E_INVALIDARG;\r
-\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
+    \r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
@@ -54,10 +48,9 @@ static HRESULT WINAPI WBCF_QueryInterface(LPCLASSFACTORY iface,
  */\r
 static ULONG WINAPI WBCF_AddRef(LPCLASSFACTORY iface)\r
 {\r
-    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 /************************************************************************\r
@@ -65,11 +58,9 @@ static ULONG WINAPI WBCF_AddRef(LPCLASSFACTORY iface)
  */\r
 static ULONG WINAPI WBCF_Release(LPCLASSFACTORY iface)\r
 {\r
-    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /************************************************************************\r
@@ -104,8 +95,13 @@ static HRESULT WINAPI WBCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter
  */\r
 static HRESULT WINAPI WBCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)\r
 {\r
-    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;\r
-    FIXME("(%p)->(%d),stub!\n", This, dolock);\r
+    TRACE("(%d)\n", dolock);\r
+\r
+    if (dolock)\r
+           SHDOCVW_LockModule();\r
+    else\r
+           SHDOCVW_UnlockModule();\r
+    \r
     return S_OK;\r
 }\r
 \r
@@ -118,4 +114,4 @@ static IClassFactoryVtbl WBCF_Vtbl =
     WBCF_LockServer\r
 };\r
 \r
-IClassFactoryImpl SHDOCVW_ClassFactory = { &WBCF_Vtbl, 1 };\r
+IClassFactoryImpl SHDOCVW_ClassFactory = {&WBCF_Vtbl};\r
index a2f7af6..928f2a3 100644 (file)
@@ -32,27 +32,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 static HRESULT WINAPI WBQA_QueryInterface(LPQUICKACTIVATE iface,\r
                                           REFIID riid, LPVOID *ppobj)\r
 {\r
-    IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBQA_AddRef(LPQUICKACTIVATE iface)\r
 {\r
-    IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBQA_Release(LPQUICKACTIVATE iface)\r
 {\r
-    IQuickActivateImpl *This = (IQuickActivateImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /* Alternative interface for quicker, easier activation of a control. */\r
@@ -90,4 +88,12 @@ static IQuickActivateVtbl WBQA_Vtbl =
     WBQA_GetContentExtent\r
 };\r
 \r
-IQuickActivateImpl SHDOCVW_QuickActivate = { &WBQA_Vtbl, 1 };\r
+IQuickActivateImpl SHDOCVW_QuickActivate = {&WBQA_Vtbl};\r
+\r
+/**********************************************************************\r
+ * OpenURL  (SHDOCVW.@)\r
+ */\r
+void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd)\r
+{\r
+    FIXME("%p %p %s %d\n", hWnd, hInst, debugstr_a(lpcstrUrl), nShowCmd);\r
+}\r
index c6b3d6c..6652b87 100644 (file)
@@ -143,10 +143,9 @@ static HRESULT WINAPI WBOOBJ_QueryInterface(LPOLEOBJECT iface,
  */\r
 static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)\r
 {\r
-    IOleObjectImpl *This = (IOleObjectImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 /************************************************************************\r
@@ -154,11 +153,9 @@ static ULONG WINAPI WBOOBJ_AddRef(LPOLEOBJECT iface)
  */\r
 static ULONG WINAPI WBOOBJ_Release(LPOLEOBJECT iface)\r
 {\r
-    IOleObjectImpl *This = (IOleObjectImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /************************************************************************\r
@@ -438,7 +435,7 @@ static IOleObjectVtbl WBOOBJ_Vtbl =
     WBOOBJ_SetColorScheme\r
 };\r
 \r
-IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };\r
+IOleObjectImpl SHDOCVW_OleObject = {&WBOOBJ_Vtbl};\r
 \r
 \r
 /**********************************************************************\r
@@ -448,27 +445,25 @@ IOleObjectImpl SHDOCVW_OleObject = { &WBOOBJ_Vtbl, 1 };
 static HRESULT WINAPI WBOIPO_QueryInterface(LPOLEINPLACEOBJECT iface,\r
                                             REFIID riid, LPVOID *ppobj)\r
 {\r
-    IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBOIPO_AddRef(LPOLEINPLACEOBJECT iface)\r
 {\r
-    IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBOIPO_Release(LPOLEINPLACEOBJECT iface)\r
 {\r
-    IOleInPlaceObjectImpl *This = (IOleInPlaceObjectImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 static HRESULT WINAPI WBOIPO_GetWindow(LPOLEINPLACEOBJECT iface, HWND* phwnd)\r
@@ -540,7 +535,7 @@ static IOleInPlaceObjectVtbl WBOIPO_Vtbl =
     WBOIPO_ReactivateAndUndo\r
 };\r
 \r
-IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };\r
+IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = {&WBOIPO_Vtbl};\r
 \r
 \r
 /**********************************************************************\r
@@ -550,27 +545,25 @@ IOleInPlaceObjectImpl SHDOCVW_OleInPlaceObject = { &WBOIPO_Vtbl, 1 };
 static HRESULT WINAPI WBOC_QueryInterface(LPOLECONTROL iface,\r
                                           REFIID riid, LPVOID *ppobj)\r
 {\r
-    IOleControlImpl *This = (IOleControlImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBOC_AddRef(LPOLECONTROL iface)\r
 {\r
-    IOleControlImpl *This = (IOleControlImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBOC_Release(LPOLECONTROL iface)\r
 {\r
-    IOleControlImpl *This = (IOleControlImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 static HRESULT WINAPI WBOC_GetControlInfo(LPOLECONTROL iface, LPCONTROLINFO pCI)\r
@@ -612,4 +605,4 @@ static IOleControlVtbl WBOC_Vtbl =
     WBOC_FreezeEvents\r
 };\r
 \r
-IOleControlImpl SHDOCVW_OleControl = { &WBOC_Vtbl, 1 };\r
+IOleControlImpl SHDOCVW_OleControl = {&WBOC_Vtbl};\r
index f7868cb..53533e5 100644 (file)
@@ -30,27 +30,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 static HRESULT WINAPI WBPS_QueryInterface(LPPERSISTSTORAGE iface,\r
                                           REFIID riid, LPVOID *ppobj)\r
 {\r
-    IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBPS_AddRef(LPPERSISTSTORAGE iface)\r
 {\r
-    IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBPS_Release(LPPERSISTSTORAGE iface)\r
 {\r
-    IPersistStorageImpl *This = (IPersistStorageImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 static HRESULT WINAPI WBPS_GetClassID(LPPERSISTSTORAGE iface, CLSID *pClassID)\r
@@ -107,7 +105,7 @@ static IPersistStorageVtbl WBPS_Vtbl =
     WBPS_SaveCompleted\r
 };\r
 \r
-IPersistStorageImpl SHDOCVW_PersistStorage = { &WBPS_Vtbl, 1 };\r
+IPersistStorageImpl SHDOCVW_PersistStorage = {&WBPS_Vtbl};\r
 \r
 \r
 /**********************************************************************\r
@@ -117,27 +115,25 @@ IPersistStorageImpl SHDOCVW_PersistStorage = { &WBPS_Vtbl, 1 };
 static HRESULT WINAPI WBPSI_QueryInterface(LPPERSISTSTREAMINIT iface,\r
                                            REFIID riid, LPVOID *ppobj)\r
 {\r
-    IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WBPSI_AddRef(LPPERSISTSTREAMINIT iface)\r
 {\r
-    IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WBPSI_Release(LPPERSISTSTREAMINIT iface)\r
 {\r
-    IPersistStreamInitImpl *This = (IPersistStreamInitImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 static HRESULT WINAPI WBPSI_GetClassID(LPPERSISTSTREAMINIT iface, CLSID *pClassID)\r
@@ -195,4 +191,4 @@ static IPersistStreamInitVtbl WBPSI_Vtbl =
     WBPSI_InitNew\r
 };\r
 \r
-IPersistStreamInitImpl SHDOCVW_PersistStreamInit = { &WBPSI_Vtbl, 1 };\r
+IPersistStreamInitImpl SHDOCVW_PersistStreamInit = {&WBPSI_Vtbl};\r
index 14b4dfe..44ea589 100644 (file)
@@ -190,4 +190,11 @@ typedef struct
 \r
 extern IConnectionPointImpl SHDOCVW_ConnectionPoint;\r
 \r
+/**********************************************************************\r
+ * Dll lifetime tracking declaration for shdocvw.dll\r
+ */\r
+extern LONG SHDOCVW_refCount;\r
+static inline void SHDOCVW_LockModule() { InterlockedIncrement( &SHDOCVW_refCount ); }\r
+static inline void SHDOCVW_UnlockModule() { InterlockedDecrement( &SHDOCVW_refCount ); }\r
+\r
 #endif /* __WINE_SHDOCVW_H */\r
index b1d54cb..c48373d 100644 (file)
 @ stub ImportPrivacySettings\r
 @ stub InstallReg_RunDLL\r
 @ stub IEWriteErrorLog\r
-@ stub OpenURL\r
+@ stdcall OpenURL(long long str long)\r
 @ stub SHGetIDispatchForFolder\r
 @ stdcall SetQueryNetSessionCount(long)\r
 @ stub SoftwareUpdateMessageBox\r
index 72a9b17..b5e1670 100644 (file)
@@ -47,6 +47,8 @@
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);\r
 \r
+LONG SHDOCVW_refCount = 0;\r
+\r
 static const WCHAR szMozDlPath[] = {\r
     'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',\r
     's','h','d','o','c','v','w',0\r
@@ -55,6 +57,7 @@ static const WCHAR szMozDlPath[] = {
 DEFINE_GUID( CLSID_MozillaBrowser, 0x1339B54C,0x3453,0x11D2,0x93,0xB9,0x00,0x00,0x00,0x00,0x00,0x00);\r
 \r
 typedef HRESULT (WINAPI *fnGetClassObject)(REFCLSID rclsid, REFIID iid, LPVOID *ppv);\r
+typedef HRESULT (WINAPI *fnCanUnloadNow)(void);\r
 \r
 HINSTANCE shdocvw_hinstance = 0;\r
 static HMODULE SHDOCVW_hshell32 = 0;\r
@@ -127,7 +130,20 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
  */\r
 HRESULT WINAPI SHDOCVW_DllCanUnloadNow(void)\r
 {\r
-    FIXME("(void): stub\n");\r
+    HRESULT moz_can_unload = S_FALSE;\r
+    fnCanUnloadNow pCanUnloadNow;\r
+\r
+    if (hMozCtl)\r
+    {\r
+        pCanUnloadNow = (fnCanUnloadNow)\r
+            GetProcAddress(hMozCtl, "DllCanUnloadNow");\r
+        moz_can_unload = pCanUnloadNow();\r
+    }\r
+    else\r
+        moz_can_unload = S_OK;\r
+\r
+    if (moz_can_unload == S_OK && SHDOCVW_refCount == 0)\r
+        return S_OK;\r
 \r
     return S_FALSE;\r
 }\r
@@ -145,6 +161,8 @@ typedef struct _IBindStatusCallbackImpl {
 static HRESULT WINAPI\r
 dlQueryInterface( IBindStatusCallback* This, REFIID riid, void** ppvObject )\r
 {\r
+    if (ppvObject == NULL) return E_POINTER;\r
+    \r
     if( IsEqualIID(riid, &IID_IUnknown) ||\r
         IsEqualIID(riid, &IID_IBindStatusCallback))\r
     {\r
@@ -158,6 +176,9 @@ dlQueryInterface( IBindStatusCallback* This, REFIID riid, void** ppvObject )
 static ULONG WINAPI dlAddRef( IBindStatusCallback* iface )\r
 {\r
     IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;\r
+\r
+    SHDOCVW_LockModule();\r
+    \r
     return InterlockedIncrement( &This->ref );\r
 }\r
 \r
@@ -165,11 +186,15 @@ static ULONG WINAPI dlRelease( IBindStatusCallback* iface )
 {\r
     IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;\r
     DWORD ref = InterlockedDecrement( &This->ref );\r
+    \r
     if( !ref )\r
     {\r
         DestroyWindow( This->hDialog );\r
         HeapFree( GetProcessHeap(), 0, This );\r
     }\r
+\r
+    SHDOCVW_UnlockModule();\r
+    \r
     return ref;\r
 }\r
 \r
index 7c40dcd..21bd351 100644 (file)
@@ -29,27 +29,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 \r
 static HRESULT WINAPI WB_QueryInterface(IWebBrowser *iface, REFIID riid, LPVOID *ppobj)\r
 {\r
-    IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+    FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));\r
 \r
-    FIXME("(%p)->(%s,%p),stub!\n", This, debugstr_guid(riid), ppobj);\r
+    if (ppobj == NULL) return E_POINTER;\r
+    \r
     return E_NOINTERFACE;\r
 }\r
 \r
 static ULONG WINAPI WB_AddRef(IWebBrowser *iface)\r
 {\r
-    IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+    SHDOCVW_LockModule();\r
 \r
-    TRACE("\n");\r
-    return ++(This->ref);\r
+    return 2; /* non-heap based object */\r
 }\r
 \r
 static ULONG WINAPI WB_Release(IWebBrowser *iface)\r
 {\r
-    IWebBrowserImpl *This = (IWebBrowserImpl *)iface;\r
+    SHDOCVW_UnlockModule();\r
 \r
-    /* static class, won't be freed */\r
-    TRACE("\n");\r
-    return --(This->ref);\r
+    return 1; /* non-heap based object */\r
 }\r
 \r
 /* IDispatch methods */\r
@@ -277,4 +275,4 @@ static IWebBrowserVtbl WB_Vtbl =
     WB_get_Busy\r
 };\r
 \r
-IWebBrowserImpl SHDOCVW_WebBrowser = { &WB_Vtbl, 1 };\r
+IWebBrowserImpl SHDOCVW_WebBrowser = {&WB_Vtbl};\r