jscript: Added DllCanUnloadNow implementation.
authorJacek Caban <jacek@codeweavers.com>
Mon, 24 Mar 2008 20:53:34 +0000 (21:53 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 25 Mar 2008 10:33:52 +0000 (11:33 +0100)
dlls/jscript/jscript.c
dlls/jscript/jscript.h
dlls/jscript/jscript_main.c

index 79b55c8e0fbb8d77ac91ef57f56d5e9f533f4483..7d7385a0b1a9e8bff8270c57b637abaeddbbe98a 100644 (file)
@@ -97,8 +97,10 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface)
 
     TRACE("(%p) ref=%d\n", iface, ref);
 
-    if(!ref)
+    if(!ref) {
         heap_free(This);
+        unlock_module();
+    }
 
     return ref;
 }
@@ -427,6 +429,8 @@ HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUn
 
     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
 
+    lock_module();
+
     ret = heap_alloc(sizeof(*ret));
 
     ret->lpIActiveScriptVtbl                 = &JScriptVtbl;
index 6a7ec7609557fd0375c97b70929bd34e4ba572bd..afdd0c74319ec80841e3a4c30afad4f121949ba9 100644 (file)
 
 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
 
+extern LONG module_ref;
+
+static inline void lock_module(void)
+{
+    InterlockedIncrement(&module_ref);
+}
+
+static inline void unlock_module(void)
+{
+    InterlockedDecrement(&module_ref);
+}
+
 static inline void *heap_alloc(size_t len)
 {
     return HeapAlloc(GetProcessHeap(), 0, len);
index f4c4bf18a53e587959118850dfa41c524b8a9cb9..92999fbc680c7c58f90074b1a16a55d47ee03b87 100644 (file)
@@ -30,6 +30,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
 
+LONG module_ref = 0;
+
 static const CLSID CLSID_JScript =
     {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
 static const CLSID CLSID_JScriptAuthor =
@@ -75,6 +77,12 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
 {
     TRACE("(%p)->(%x)\n", iface, fLock);
+
+    if(fLock)
+        lock_module();
+    else
+        unlock_module();
+
     return S_OK;
 }
 
@@ -127,8 +135,9 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  */
 HRESULT WINAPI DllCanUnloadNow(void)
 {
-    FIXME("()\n");
-    return S_FALSE;
+    TRACE("() ref=%d\n", module_ref);
+
+    return module_ref ? S_FALSE : S_OK;
 }
 
 /***********************************************************************