Hi,
I have write a patch for the problem, please comment.
=========================================================================== --- wine-1.1.0-orig/dlls/user32/class.c 2008-06-28 00:24:42.000000000 +1000 +++ wine-1.1.0/dlls/user32/class.c 2008-07-10 17:35:11.000000000 +1000 @@ -906,9 +906,18 @@ static ULONG_PTR CLASS_SetClassLong( HWN retval = 0; /* Old value is now meaningless anyway */ break; case GCLP_WNDPROC: - retval = (ULONG_PTR)WINPROC_GetProc( class->winproc, unicode ); - class->winproc = WINPROC_AllocProc( unicode ? NULL : (WNDPROC)newval, - unicode ? (WNDPROC)newval : NULL ); + if( unicode && class->winproc == EDIT_winproc_handle ) + { + retval = class->winproc; + /* if subclassing Edit class, WndProc must handle both Ansi and Unicode Message*/ + class->winproc = WINPROC_AllocProc( (WNDPROC)newval, (WNDPROC)newval ); + } + else + { + retval = (ULONG_PTR)WINPROC_GetProc( class->winproc, unicode ); + class->winproc = WINPROC_AllocProc( unicode ? NULL : (WNDPROC)newval, + unicode ? (WNDPROC)newval : NULL ); + } break; case GCLP_HBRBACKGROUND: retval = (ULONG_PTR)class->hbrBackground;
--- wine-1.1.0-orig/dlls/user32/winproc.c 2008-06-28 00:24:42.000000000 +1000 +++ wine-1.1.0/dlls/user32/winproc.c 2008-07-10 17:35:11.000000000 +1000 @@ -145,7 +145,7 @@ static inline WINDOWPROC *alloc_winproc( /* check if we already have a winproc for that function */ if (!(proc = find_winproc( funcA, funcW ))) { - if (funcA && funcW) + if (funcA && funcW && builtin_used < BUILTIN_WINPROCS ) { assert( builtin_used < BUILTIN_WINPROCS ); proc = &winproc_array[builtin_used++];
===================================================================================== ________________________________
From: hongbo_ni@hotmail.com To: wine-devel@winehq.org Subject: user32: Problem using SetClassLongW to subclass built-in control (Edit) Date: Wed, 9 Jul 2008 22:06:22 +1000
Hi,
Summary: SetClassLongW(hEdit, GCL_WNDPROC,(DWORD)NewEditWndProc) in Wine differs from Windows.
Background: when a standard built-in window class (such as Edit for example) is registered initially, the window system register the class with two Procedures (procA and ProcW) and assign a handle as WNDPROC to the class. If a Edit window is created using CreateWindowExA, it will be an Ansi Window. If a Edit window is created using CreateWindowExW, it will be an Unicode Window. This fine in Wine.
Problem: I globally subclass the Edit class using SetClassLongW using following code
HWND hEdit = CreateWindowExA(0,"Edit", "E1",WS_POPUP,0, 0, 1,1,NULL,NULL,NULL,NULL); OldEditWndProc =(WNDPROC)SetClassLongW(hEdit, GCL_WNDPROC,(DWORD)NewEditWndProc);
After this subclass, Wine behaves different from Windows
In Windows: a new Edit windows created by CreateWindowsExA((0,"Edit",...) is a Still an Ansi Windows a new Edit windows created by CreateWindowsExW((0,"Edit",...) is a Unicode Windows
But in Wine, new Edit windows created by CreateWindowsExA or CreateWindowsExW are all Unicode Windows. I checked wine 1.1 source code , basically the call to SetClassLongW(hEdit, GCL_WNDPROC,(DWORD)NewEditWndProc) has set the Edit class proc to Unicode Only. So regardless how you create the Edit window, it will be Unicode window.
This is understandable but it's different form windows. causing my application to mis-behave.
More problem, the OldEditWndProc returned above is only the procW of Edit class, if we try to undo the subclass with SetClassLongW(hEdit, GCL_WNDPROC,(DWORD)OldEditWndProc ); the Edit class also lost it's procA.
Discussion: How wine could do the same as windows?
SetClassLongW(hEdit, GCL_WNDPROC,(DWORD)NewEditWndProc) should
return the proc handle of the class, instead of procW.
set both ProcA and ProcW of Edit class to NewEditWndProc. so NewEditWndProc need to handle both messages from Ansi and Unicode Edit control.
I don't know what is the best way to fix this. Please help.
I have posted a Test application on Bugzilla #14350, please try.
Regards Hongbo
Find out: SEEK Salary Centre Are you paid what you're worth?
_________________________________________________________________ Are you paid what you're worth? Find out: SEEK Salary Centre http://a.ninemsn.com.au/b.aspx?URL=http%3A%2F%2Fninemsn%2Eseek%2Ecom%2Eau%2F...