Module: wine Branch: refs/heads/master Commit: e02e539c1e91cffe4f29281c8a120ba60c041ba2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e02e539c1e91cffe4f29281c...
Author: Christian Gmeiner christian.gmeiner@students.fh-vorarlberg.ac.at Date: Mon Dec 5 20:39:33 2005 +0100
msi: Implemented DllCanUnloadNow.
---
dlls/msi/msi.c | 28 +++++++++++++++++++++++++--- 1 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 625b16c..0591a42 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -53,8 +53,24 @@ LPVOID gUIContext = NULL; WCHAR gszLogFile[MAX_PATH]; HINSTANCE msi_hInstance;
+static LONG dll_count; + static const WCHAR installerW[] = {'\','I','n','s','t','a','l','l','e','r',0};
+/********************************************************************** + * Dll lifetime tracking declaration + */ +static void LockModule(void) +{ + InterlockedIncrement(&dll_count); +} + +static void UnlockModule(void) +{ + InterlockedDecrement(&dll_count); +} + + UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct) { UINT r; @@ -1285,11 +1301,13 @@ static HRESULT WINAPI MsiCF_QueryInterfa
static ULONG WINAPI MsiCF_AddRef(LPCLASSFACTORY iface) { + LockModule(); return 2; }
static ULONG WINAPI MsiCF_Release(LPCLASSFACTORY iface) { + UnlockModule(); return 1; }
@@ -1304,9 +1322,13 @@ static HRESULT WINAPI MsiCF_CreateInstan
static HRESULT WINAPI MsiCF_LockServer(LPCLASSFACTORY iface, BOOL dolock) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + TRACE("(%p)->(%d)\n", iface, dolock); + + if(dolock) + LockModule(); + else + UnlockModule();
- FIXME("%p %d\n", This, dolock); return S_OK; }
@@ -1363,7 +1385,7 @@ HRESULT WINAPI DllGetVersion(DLLVERSIONI */ HRESULT WINAPI DllCanUnloadNow(void) { - return S_FALSE; + return dll_count == 0 ? S_OK : S_FALSE; }
/***********************************************************************