Dmitry Timoshkov : user32: Add an invalid window check to SetActiveWindow.

Alexandre Julliard julliard at winehq.org
Thu Jan 5 15:24:42 CST 2012


Module: wine
Branch: master
Commit: 98e2bf4e1ccd5ffa4fbadf08a951754ff1cc7945
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=98e2bf4e1ccd5ffa4fbadf08a951754ff1cc7945

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Thu Jan  5 17:58:30 2012 +0800

user32: Add an invalid window check to SetActiveWindow.

---

 dlls/user32/focus.c     |   12 +++++++++---
 dlls/user32/tests/msg.c |    3 +--
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/focus.c b/dlls/user32/focus.c
index 9fdae25..6b5312f 100644
--- a/dlls/user32/focus.c
+++ b/dlls/user32/focus.c
@@ -232,12 +232,18 @@ HWND WINAPI SetActiveWindow( HWND hwnd )
 
     if (hwnd)
     {
-        LONG style = GetWindowLongW( hwnd, GWL_STYLE );
+        LONG style;
 
+        hwnd = WIN_GetFullHandle( hwnd );
+        if (!IsWindow( hwnd ))
+        {
+            SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+            return 0;
+        }
+
+        style = GetWindowLongW( hwnd, GWL_STYLE );
         if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD)
             return GetActiveWindow();  /* Windows doesn't seem to return an error here */
-
-        hwnd = WIN_GetFullHandle( hwnd );
     }
 
     if (!set_active_window( hwnd, &prev, FALSE, TRUE )) return 0;
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 6fa4d10..6f40a0b 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -13602,10 +13602,9 @@ static void test_SetFocus(void)
 
     SetLastError(0xdeadbeef);
     old_active = SetActiveWindow((HWND)0xdeadbeef);
-todo_wine
     ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError());
     while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg);
-    ok_sequence(WmEmptySeq, "SetActiveWindow on an invalid window", TRUE);
+    ok_sequence(WmEmptySeq, "SetActiveWindow on an invalid window", FALSE);
     ok(old_active == 0, "expected old focus 0, got %p\n", old_active);
     ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow());
     ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus());




More information about the wine-cvs mailing list