[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