Dmitry Timoshkov : user32: Return 0 from DefDlgProc and dialog loop for invalid dialog handles.

Alexandre Julliard julliard at winehq.org
Wed Aug 12 11:09:01 CDT 2009


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Wed Aug 12 11:59:38 2009 +0900

user32: Return 0 from DefDlgProc and dialog loop for invalid dialog handles.

---

 dlls/user32/defdlg.c       |    9 ++++++---
 dlls/user32/dialog.c       |    2 +-
 dlls/user32/tests/dialog.c |   16 +++++++++++-----
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/dlls/user32/defdlg.c b/dlls/user32/defdlg.c
index ee1b58e..6096890 100644
--- a/dlls/user32/defdlg.c
+++ b/dlls/user32/defdlg.c
@@ -345,7 +345,10 @@ DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create )
 
     wndPtr = WIN_GetPtr( hwnd );
     if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
+    {
+        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return NULL;
+    }
 
     dlgInfo = wndPtr->dlgInfo;
 
@@ -382,7 +385,7 @@ LRESULT WINAPI DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
     BOOL result = FALSE;
 
     /* Perform DIALOGINFO initialization if not done */
-    if(!(dlgInfo = DIALOG_get_info(hwnd32, TRUE))) return -1;
+    if(!(dlgInfo = DIALOG_get_info(hwnd32, TRUE))) return 0;
 
     SetWindowLongPtrW( hwnd32, DWLP_MSGRESULT, 0 );
 
@@ -433,7 +436,7 @@ LRESULT WINAPI DefDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
     BOOL result = FALSE;
 
     /* Perform DIALOGINFO initialization if not done */
-    if(!(dlgInfo = DIALOG_get_info( hwnd, TRUE ))) return -1;
+    if(!(dlgInfo = DIALOG_get_info( hwnd, TRUE ))) return 0;
 
     SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, 0 );
 
@@ -484,7 +487,7 @@ LRESULT WINAPI DefDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
     DLGPROC dlgproc;
 
     /* Perform DIALOGINFO initialization if not done */
-    if(!(dlgInfo = DIALOG_get_info( hwnd, TRUE ))) return -1;
+    if(!(dlgInfo = DIALOG_get_info( hwnd, TRUE ))) return 0;
 
     SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, 0 );
 
diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c
index 5710807..e8927e9 100644
--- a/dlls/user32/dialog.c
+++ b/dlls/user32/dialog.c
@@ -809,7 +809,7 @@ INT DIALOG_DoDialogBox( HWND hwnd, HWND owner )
                 if (!GetMessageW( &msg, 0, 0, 0 )) break;
             }
 
-            if (!IsWindow( hwnd )) return -1;
+            if (!IsWindow( hwnd )) return 0;
             if (!(dlgInfo->flags & DF_END) && !IsDialogMessageW( hwnd, &msg))
             {
                 TranslateMessage( &msg );
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index 8fe1cc4..fd4c225 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -932,12 +932,12 @@ static INT_PTR CALLBACK DestroyOnCloseDlgWinProc (HWND hDlg, UINT uiMsg,
 
 static void test_DialogBoxParamA(void)
 {
-    int ret;
+    INT_PTR ret;
     HWND hwnd_invalid = (HWND)0x4444;
 
     SetLastError(0xdeadbeef);
     ret = DialogBoxParamA(GetModuleHandle(NULL), "IDD_DIALOG" , hwnd_invalid, 0 , 0);
-    ok(0 == ret || broken(ret == -1), "DialogBoxParamA returned %d, expected 0\n", ret);
+    ok(0 == ret || broken(ret == -1), "DialogBoxParamA returned %ld, expected 0\n", ret);
     ok(ERROR_INVALID_WINDOW_HANDLE == GetLastError() ||
        broken(GetLastError() == 0xdeadbeef),
        "got %d, expected ERROR_INVALID_WINDOW_HANDLE\n",GetLastError());
@@ -945,7 +945,7 @@ static void test_DialogBoxParamA(void)
     /* Test a dialog which destroys itself on WM_INITDIALOG. */
     SetLastError(0xdeadbeef);
     ret = DialogBoxParamA(GetModuleHandle(NULL), "IDD_DIALOG", 0, DestroyDlgWinProc, 0);
-    ok(-1 == ret, "DialogBoxParamA returned %d, expected -1\n", ret);
+    ok(-1 == ret, "DialogBoxParamA returned %ld, expected -1\n", ret);
     ok(ERROR_INVALID_WINDOW_HANDLE == GetLastError() ||
        GetLastError() == ERROR_SUCCESS ||
        broken(GetLastError() == 0xdeadbeef),
@@ -953,14 +953,20 @@ static void test_DialogBoxParamA(void)
 
     /* Test a dialog which destroys itself on WM_CLOSE. */
     ret = DialogBoxParamA(GetModuleHandle(NULL), "IDD_DIALOG", 0, DestroyOnCloseDlgWinProc, 0);
-    todo_wine ok(0 == ret, "DialogBoxParamA returned %d, expected 0\n", ret);
+    ok(0 == ret, "DialogBoxParamA returned %ld, expected 0\n", ret);
 
     SetLastError(0xdeadbeef);
     ret = DialogBoxParamA(GetModuleHandle(NULL), "RESOURCE_INVALID" , 0, 0, 0);
-    ok(-1 == ret, "DialogBoxParamA returned %d, expected -1\n", ret);
+    ok(-1 == ret, "DialogBoxParamA returned %ld, expected -1\n", ret);
     ok(ERROR_RESOURCE_NAME_NOT_FOUND == GetLastError() ||
        broken(GetLastError() == 0xdeadbeef),
        "got %d, expected ERROR_RESOURCE_NAME_NOT_FOUND\n",GetLastError());
+
+    SetLastError(0xdeadbeef);
+    ret = DefDlgProcA(0, WM_ERASEBKGND, 0, 0);
+    ok(ret == 0, "DefDlgProcA returned %ld, expected 0\n", ret);
+    ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE,
+       "got %d, expected ERROR_INVALID_WINDOW_HANDLE\n", GetLastError());
 }
 
 static void test_DisabledDialogTest(void)




More information about the wine-cvs mailing list