[2/3] msi: Unicode and ANSI global UI handlers are mutually exclusive.

Hans Leidekker hans at codeweavers.com
Mon Nov 2 03:03:39 CST 2009


---
 dlls/msi/msi.c           |   10 ++++++----
 dlls/msi/tests/install.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 8558a75..8b56705 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1905,8 +1905,9 @@ INSTALLUI_HANDLERA WINAPI MsiSetExternalUIA(INSTALLUI_HANDLERA puiHandler,
     TRACE("%p %08x %p\n", puiHandler, dwMessageFilter, pvContext);
 
     gUIHandlerA = puiHandler;
-    gUIFilter = dwMessageFilter;
-    gUIContext = pvContext;
+    gUIHandlerW = NULL;
+    gUIFilter   = dwMessageFilter;
+    gUIContext  = pvContext;
 
     return prev;
 }
@@ -1918,9 +1919,10 @@ INSTALLUI_HANDLERW WINAPI MsiSetExternalUIW(INSTALLUI_HANDLERW puiHandler,
 
     TRACE("%p %08x %p\n", puiHandler, dwMessageFilter, pvContext);
 
+    gUIHandlerA = NULL;
     gUIHandlerW = puiHandler;
-    gUIFilter = dwMessageFilter;
-    gUIContext = pvContext;
+    gUIFilter   = dwMessageFilter;
+    gUIContext  = pvContext;
 
     return prev;
 }
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index badbb09..216ab97 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -6871,6 +6871,39 @@ static void test_file_in_use_cab(void)
     delete_test_files();
 }
 
+INT CALLBACK handler_a(LPVOID context, UINT type, LPCSTR msg) { return IDOK; };
+INT CALLBACK handler_w(LPVOID context, UINT type, LPCWSTR msg) { return IDOK; };
+
+static void test_MsiSetExternalUI(void)
+{
+    INSTALLUI_HANDLERA ret_a;
+    INSTALLUI_HANDLERW ret_w;
+
+    ret_a = MsiSetExternalUIA(handler_a, INSTALLLOGMODE_ERROR, NULL);
+    ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
+
+    ret_a = MsiSetExternalUIA(NULL, 0, NULL);
+    ok(ret_a == handler_a, "expected %p, got %p\n", handler_a, ret_a);
+
+    ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL);
+    ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
+
+    ret_w = MsiSetExternalUIW(NULL, 0, NULL);
+    ok(ret_w == handler_w, "expected %p, got %p\n", handler_w, ret_w);
+
+    ret_a = MsiSetExternalUIA(handler_a, INSTALLLOGMODE_ERROR, NULL);
+    ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
+
+    ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL);
+    ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
+
+    ret_a = MsiSetExternalUIA(NULL, 0, NULL);
+    ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
+
+    ret_w = MsiSetExternalUIW(NULL, 0, NULL);
+    ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
+}
+
 START_TEST(install)
 {
     DWORD len;
@@ -6959,6 +6992,7 @@ START_TEST(install)
     test_installed_prop();
     test_file_in_use();
     test_file_in_use_cab();
+    test_MsiSetExternalUI();
 
     DeleteFileA(log_file);
 
-- 
1.6.3.3





More information about the wine-patches mailing list