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