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