Christian Gmeiner : mlang: Implement DllCanUnloadNow.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Mar 4 11:09:59 CST 2006


Module: wine
Branch: refs/heads/master
Commit: ad4af1264fff1c949578a5fdd65a2e7bfa6544e1
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ad4af1264fff1c949578a5fdd65a2e7bfa6544e1

Author: Christian Gmeiner <christian.gmeiner at students.fh-vorarlberg.ac.at>
Date:   Fri Mar  3 10:04:08 2006 +0100

mlang: Implement DllCanUnloadNow.

---

 dlls/mlang/mlang.c |   28 ++++++++++++++++++++++++----
 1 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index f2f759c..e339b02 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -453,6 +453,21 @@ static const struct mlang_data
 
 static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info);
 
+static LONG dll_count;
+
+/*
+ * Dll lifetime tracking declaration
+ */
+static void LockModule(void)
+{
+    InterlockedIncrement(&dll_count);
+}
+
+static void UnlockModule(void)
+{
+    InterlockedDecrement(&dll_count);
+}
+
 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 {
     switch(fdwReason) {
@@ -735,8 +750,11 @@ static HRESULT WINAPI MLANGCF_CreateInst
 
 static HRESULT WINAPI MLANGCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
 {
-    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-    FIXME("(%p)->(%d),stub!\n",This,dolock);
+    if (dolock)
+        LockModule();
+    else
+        UnlockModule();
+
     return S_OK;
 }
 
@@ -2281,6 +2299,9 @@ static HRESULT MultiLanguage_create(IUnk
     mlang->ref = 1;
     *ppObj = (LPVOID) mlang;
     TRACE("returning %p\n", mlang);
+
+    LockModule();
+
     return S_OK;
 }
 
@@ -2288,8 +2309,7 @@ static HRESULT MultiLanguage_create(IUnk
 
 HRESULT WINAPI DllCanUnloadNow(void)
 {
-    FIXME("\n");
-    return S_FALSE;
+    return dll_count == 0 ? S_OK : S_FALSE;
 }
 
 HRESULT WINAPI GetGlobalFontLinkObject(void)




More information about the wine-cvs mailing list