On 03/29/2015 01:54 AM, Mark Harmstone wrote:
This patch implements the class redirection feature of activation contexts, as used by version 6 of comctl32. Among other things, this is a necessary step in fixing the behaviour seen in bug 38124.
dlls/user32/win.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)
In principle it looks almost okay, except that I don't think we need it right now, as long as comctl32 doesn't register versioned classes at all. It will just wait time for every window creation requested looking for something that can't be created. Comments on code itself to follow.
- classatom = get_int_atom_value(className);
- if (classatom)
GlobalGetAtomNameW(classatom, classNameStr, sizeof(classNameStr) / sizeof(*classNameStr));
- else
strcpyW(classNameStr, className);
You don't need to copy in case of a string.
if (wcrd->name_len == 0)
return FALSE;
I don't think it can be 0, ever. Name comes from class name from module manifest and assembly version string.
memcpy(redirClassName, (unsigned char*)askd.lpData + wcrd->name_offset, wcrd->name_len);
redirClassName[wcrd->name_len / sizeof(WCHAR)] = 0;
All strings in context data are null-terminated, so you don't need this complexity. In fact you don't need to copy anything at all, you can just use a (WCHAR*)((BYTE*)askd.lpData + wcrd->name_offset) as a ready-to-use pointer, I think it's a preferred way, given that overhead of this redirection lookup should be minimal.
So your helper only needs to return a pointer - original one or computed from redirection data. And atoms should be resolved outside of it.
- WCHAR redirClassName[256];
Is it defined somewhere to be limited to that?
wndPtr = create_window_handle( parent, owner, redirClassName, module, unicode );
if (GetLastError() == ERROR_INVALID_HANDLE && GetClassInfoW( 0, redirClassName, &wc ))
wndPtr = create_window_handle( parent, owner, redirClassName, module, unicode );
I don't quite get what you're trying to do here? How does same call help if called second time? Also last error check is strange.