ATL: implementation of CanUnloadNow
Jacek Caban
jack at itma.pwr.wroc.pl
Wed Mar 16 14:59:24 CST 2005
Changelog:
Added implementation of CanUnloadNow
-------------- next part --------------
Index: dlls/atl/atl.spec
===================================================================
RCS file: /home/wine/wine/dlls/atl/atl.spec,v
retrieving revision 1.8
diff -u -p -r1.8 atl.spec
--- dlls/atl/atl.spec 7 Mar 2005 11:02:31 -0000 1.8
+++ dlls/atl/atl.spec 16 Mar 2005 20:52:10 -0000
@@ -1,4 +1,4 @@
-1 stub DllCanUnloadNow
+1 stdcall -private DllCanUnloadNow() ATL_CanUnloadNow
2 stdcall -private DllGetClassObject(ptr ptr ptr) ATL_DllGetClassObject
3 stdcall -private DllRegisterServer() ATL_DllRegisterServer
4 stdcall -private DllUnregisterServer() ATL_DllUnregisterServer
Index: dlls/atl/registrar.c
===================================================================
RCS file: /home/wine/wine/dlls/atl/registrar.c,v
retrieving revision 1.2
diff -u -p -r1.2 registrar.c
--- dlls/atl/registrar.c 16 Mar 2005 19:53:41 -0000 1.2
+++ dlls/atl/registrar.c 16 Mar 2005 20:52:10 -0000
@@ -37,6 +37,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(atl);
+ULONG dll_count = 0;
+
/**************************************************************
* ATLRegistrar implementation
*/
@@ -478,6 +480,7 @@ static ULONG WINAPI Registrar_Release(IR
if(!ref) {
IRegistrar_ClearReplacements(iface);
HeapFree(GetProcessHeap(), 0, This);
+ InterlockedDecrement(&dll_count);
}
return ref;
}
@@ -618,6 +621,8 @@ static HRESULT Registrar_create(LPUNKNOW
ret->rep = NULL;
*ppvObject = ret;
+ InterlockedIncrement(&dll_count);
+
return S_OK;
}
@@ -639,11 +644,13 @@ static HRESULT WINAPI RegistrarCF_QueryI
static ULONG WINAPI RegistrarCF_AddRef(IClassFactory *iface)
{
+ InterlockedIncrement(&dll_count);
return 2;
}
static ULONG WINAPI RegistrarCF_Release(IClassFactory *iface)
{
+ InterlockedDecrement(&dll_count);
return 1;
}
@@ -656,7 +663,13 @@ static HRESULT WINAPI RegistrarCF_Create
static HRESULT WINAPI RegistrarCF_LockServer(IClassFactory *iface, BOOL lock)
{
- FIXME("(%p)->(%x)\n", iface, lock);
+ TRACE("(%p)->(%x)\n", iface, lock);
+
+ if(lock)
+ InterlockedIncrement(&dll_count);
+ else
+ InterlockedDecrement(&dll_count);
+
return S_OK;
}
@@ -732,3 +745,13 @@ HRESULT WINAPI ATL_DllUnregisterServer(v
TRACE("\n");
return do_register_server(FALSE);
}
+
+/***********************************************************************
+ * CanUnloadNow (ATL.@)
+ */
+HRESULT WINAPI ATL_CanUnloadNow()
+{
+ TRACE("dll_count = %lu\n", dll_count);
+ return dll_count ? S_FALSE : S_OK;
+}
+
More information about the wine-patches
mailing list