[PATCH] user32: Support activation context class redirection in CreateWindow.

Nikolay Sivov nsivov at codeweavers.com
Sun Mar 29 08:15:00 CDT 2015

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.

More information about the wine-devel mailing list