user32: CallWindowProc[AW] for mismatched built-in winprocs should take into account if the window is Unicode (with testcase, fixes bug #9198)

Dmitry Timoshkov dmitry at codeweavers.com
Wed Aug 8 00:07:57 CDT 2007


"Mikolaj Zalewski" <mikolaj at zalewski.pl> wrote:

> --- a/dlls/user32/tests/class.c
> +++ b/dlls/user32/tests/class.c
> @@ -32,6 +32,7 @@
> #include "winreg.h"
> #include "wingdi.h"
> #include "winuser.h"
> +#include <commctrl.h>  /* for WC_EDITW */

Besides using braces instead of quotes to match existing style it's not really
nice to include commctrl.h in a user32 (more lower level) test. It shouldn't be
too hard to add "Edit" in WCHAR notation.

> /***********************************************************************
>  */
> static void ClassTest(HINSTANCE hInstance, BOOL global)
> @@ -560,7 +566,12 @@ static void test_defwndproc()
> {
>     static const char classA[] = "deftest";
>     static const WCHAR classW[] = {'d','e','f','t','e','s','t',0};
> +    WCHAR unistring[] = {0x142, 0x40e, 0x3b4, 0};  /* a string that would be destoryed by a W->A->W conversion */

Any other string should work just fine. In the current form the test will fail
for some locales.

> diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
> index 27b31a1..4feb3d5 100644
> --- a/dlls/user32/winproc.c
> +++ b/dlls/user32/winproc.c
> @@ -2257,7 +2257,17 @@ LRESULT WINAPI CallWindowProcA(
> 
>     if (!func) return 0;
> 
> -    if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func )))
> +    /* for built-in procs we do as if the second item was a thunk */
> +    if ((proc = find_builtin_proc( func )) != NULL)
> +    {
> + if (func == proc->procA || !IsWindowUnicode( hwnd ))
> +     call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> + else
> +     call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
> + return result;
> +    }
> +    
> +    if (!(proc = handle_to_proc( func )))
>         call_window_proc( hwnd, msg, wParam, lParam, &result, func );
>     else if (proc->procA)
>         call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> @@ -2281,8 +2291,18 @@ LRESULT WINAPI CallWindowProcW( WNDPROC func, HWND hwnd, UINT msg,
>     LRESULT result;
> 
>     if (!func) return 0;
> +    
> +    /* for built-in procs we do as if the second item was a thunk */
> +    if ((proc = find_builtin_proc( func )) != NULL)
> +    {
> + if (func == proc->procW || IsWindowUnicode( hwnd ))
> +     call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
> + else
> +     call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> + return result;
> +    }
> 
> -    if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func )))
> +    if (!(proc = handle_to_proc( func )))
>         call_window_proc( hwnd, msg, wParam, lParam, &result, func );
>     else if (proc->procW)
>         call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
> @@ -2340,7 +2360,17 @@ INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
> 
>     if (!func) return 0;
> 
> -    if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func )))
> +    /* for built-in procs we do as if the second item was a thunk */
> +    if ((proc = find_builtin_proc( func )) != NULL)
> +    {
> + if (func == proc->procA || !IsWindowUnicode( hwnd ))
> +     call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> + else
> +     call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
> + return result;
> +    }
> +
> +    if (!(proc = handle_to_proc( func )))
>         ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
>     else if (proc->procA)
>         ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> @@ -2368,8 +2398,18 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
>     INT_PTR ret;
> 
>     if (!func) return 0;
> +    
> +    /* for built-in procs we do as if the second item was a thunk */
> +    if ((proc = find_builtin_proc( func )) != NULL)
> +    {
> + if (func == proc->procW || IsWindowUnicode( hwnd ))
> +     call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
> + else
> +     call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
> + return result;
> +    }

Please use spaces instead of tabs to match current formatting.

-- 
Dmitry.



More information about the wine-devel mailing list