[PATCH] hlink: implement DllCanUnloadNow()

Paul Bryan Roberts pbronline-wine at yahoo.co.uk
Sun Nov 16 15:20:25 CST 2008


---
 dlls/hlink/browse_ctx.c    |    5 +++++
 dlls/hlink/extserv.c       |    4 ++++
 dlls/hlink/hlink_main.c    |   12 ++++++++++--
 dlls/hlink/hlink_private.h |    4 ++++
 dlls/hlink/link.c          |    5 +++++
 5 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/dlls/hlink/browse_ctx.c b/dlls/hlink/browse_ctx.c
index f0274b0..67be177 100644
--- a/dlls/hlink/browse_ctx.c
+++ b/dlls/hlink/browse_ctx.c
@@ -53,6 +53,8 @@ HRESULT WINAPI HLinkBrowseContext_Constructor(IUnknown *pUnkOuter, REFIID riid,
     hl->ref = 1;
     hl->lpVtbl = &hlvt;
 
+    LOCK_MODULE();
+
     *ppv = hl;
     return S_OK;
 }
@@ -99,6 +101,9 @@ static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface)
     if (This->CurrentPage)
         IHlink_Release(This->CurrentPage);
     heap_free(This);
+
+    UNLOCK_MODULE();
+
     return 0;
 }
 
diff --git a/dlls/hlink/extserv.c b/dlls/hlink/extserv.c
index c4e95ab..0fd655b 100644
--- a/dlls/hlink/extserv.c
+++ b/dlls/hlink/extserv.c
@@ -98,6 +98,8 @@ static ULONG WINAPI ExtServUnk_Release(IUnknown *iface)
         heap_free(This->password);
         heap_free(This->headers);
         heap_free(This);
+
+        UNLOCK_MODULE();
     }
 
     return ref;
@@ -339,5 +341,7 @@ HRESULT WINAPI HlinkCreateExtensionServices(LPCWSTR pwzAdditionalHeaders,
         hres = E_INVALIDARG;
     }
 
+    LOCK_MODULE();
+
     return hres;
 }
diff --git a/dlls/hlink/hlink_main.c b/dlls/hlink/hlink_main.c
index 213506e..968c154 100644
--- a/dlls/hlink/hlink_main.c
+++ b/dlls/hlink/hlink_main.c
@@ -27,6 +27,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(hlink);
 
+LONG module_ref = 0;
+
 typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown*, REFIID, LPVOID*);
 
 typedef struct
@@ -55,8 +57,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  */
 HRESULT WINAPI DllCanUnloadNow( void )
 {
-    FIXME("\n");
-    return S_OK;
+    TRACE("() ref=%d\n", module_ref);
+    return module_ref ? S_FALSE : S_OK;
 }
 
 /***********************************************************************
@@ -469,6 +471,12 @@ static HRESULT WINAPI HLinkCF_fnCreateInstance( LPCLASSFACTORY iface,
 static HRESULT WINAPI HLinkCF_fnLockServer(LPCLASSFACTORY iface, BOOL fLock)
 {
     FIXME("%p %d\n", iface, fLock);
+
+    if(fLock)
+        LOCK_MODULE();
+    else
+        UNLOCK_MODULE();
+
     return E_NOTIMPL;
 }
 
diff --git a/dlls/hlink/hlink_private.h b/dlls/hlink/hlink_private.h
index 0df374c..15d13f4 100644
--- a/dlls/hlink/hlink_private.h
+++ b/dlls/hlink/hlink_private.h
@@ -29,6 +29,10 @@
 
 #include "wine/unicode.h"
 
+extern LONG module_ref;
+#define LOCK_MODULE()   InterlockedIncrement(&module_ref)
+#define UNLOCK_MODULE() InterlockedDecrement(&module_ref)
+
 extern HRESULT WINAPI HLink_Constructor(IUnknown*,REFIID,void**);
 extern HRESULT WINAPI HLinkBrowseContext_Constructor(IUnknown*,REFIID,void**);
 
diff --git a/dlls/hlink/link.c b/dlls/hlink/link.c
index 20841f8..346ba30 100644
--- a/dlls/hlink/link.c
+++ b/dlls/hlink/link.c
@@ -107,6 +107,8 @@ HRESULT WINAPI HLink_Constructor(IUnknown *pUnkOuter, REFIID riid,
     hl->lpPSVtbl = &psvt;
     hl->lpDOVtbl = &dovt;
 
+    LOCK_MODULE();
+
     *ppv = hl;
     return S_OK;
 }
@@ -164,6 +166,9 @@ static ULONG WINAPI IHlink_fnRelease (IHlink* iface)
     if (This->Site)
         IHlinkSite_Release(This->Site);
     heap_free(This);
+
+    UNLOCK_MODULE();
+
     return 0;
 }
 
-- 
1.5.4.3


--------------090005090307020101030003--



More information about the wine-patches mailing list