On Fri, Jul 22, 2005 at 12:08:58PM +0200, Alexandre Julliard wrote:
Marcus Meissner meissner@suse.de writes:
In 2001 when windows/property.c moved to dlls/user/property.c additionaly EnumProps16 gained the ability to enumerate non-string atoms.
This brings a 16 bit application I have here to crash in repne scansb es:(di), so it clearly expects get only strings.
Ciao, Marcus
Changelog: Do not enumerate non-strings in EnumProp16.
That ability was added specifically for 16-bit apps, so I don't think it should be removed. Probably the problem is because of some Wine internal property. Can you find out which property is causing trouble?
Ok, after #winehackers discussion the first hunk of the fix and the second hunk ... I try harder to pass a string down to userland.
Ciao, Marcus
Changelog: Fixed call to get_window_properties(). Try harder to supply a string for 16 bit userland.
Index: dlls/user/property.c =================================================================== RCS file: /home/wine/wine/dlls/user/property.c,v retrieving revision 1.13 diff -u -r1.13 property.c --- dlls/user/property.c 11 May 2005 19:01:10 -0000 1.13 +++ dlls/user/property.c 22 Jul 2005 15:08:42 -0000 @@ -55,7 +58,7 @@ SERVER_START_REQ( get_window_properties ) { req->window = hwnd; - wine_server_add_data( req, data, total * sizeof(*data) ); + wine_server_set_reply ( req, data, total * sizeof(*data) ); if (!wine_server_call( req )) res = reply->total; } SERVER_END_REQ; @@ -272,20 +277,24 @@
for (i = 0; i < count; i++) { + args[3] = hwnd; + args[0] = LOWORD(list[i].handle); if (list[i].string) /* it was a string originally */ { if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue; - args[3] = hwnd; args[2] = SELECTOROF(segptr); args[1] = OFFSETOF(segptr); - args[0] = LOWORD(list[i].handle); } else { - args[3] = hwnd; - args[2] = 0; - args[1] = list[i].atom; - args[0] = LOWORD(list[i].handle); + /* Perhaps this was a string originally too. */ + if (GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) { + args[2] = SELECTOROF(segptr); + args[1] = OFFSETOF(segptr); + } else { + args[2] = 0; + args[1] = list[i].atom; + } } WOWCallback16Ex( (DWORD)func, WCB16_PASCAL, sizeof(args), args, &result ); if (!(ret = LOWORD(result))) break;