Add support for MDICREATESTRUCT conversion for 16-bit windows
Dmitry Timoshkov
dmitry at baikal.ru
Thu Jan 22 09:45:18 CST 2004
Hello,
I've got a bug report that after my MDI rewrite some 16-bit MDI app
stopped to work. That's not a surprise at all. The surprise is that
STRUCT32_xxx conversion helpers didn't cope correctly with 16-bit
hInstance and actually that caused a 16-bit app to misbehave in
the first place. I had to use GetExePtr() because MapHModuleSL checks
for NE_FFLAGS_WIN32 (why?) and bails out.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Add support for MDICREATESTRUCT conversion for 16-bit windows.
Fix a bug with mapping 16-bit hInstance to a 32-bit one and back.
diff -u cvs/hq/wine/windows/struct32.c wine/windows/struct32.c
--- cvs/hq/wine/windows/struct32.c 2002-11-26 13:47:59.000000000 +0800
+++ wine/windows/struct32.c 2004-01-22 22:50:46.000000000 +0800
@@ -91,7 +91,7 @@ void STRUCT32_CREATESTRUCT32Ato16( const
CREATESTRUCT16* to )
{
to->lpCreateParams = from->lpCreateParams;
- to->hInstance = HINSTANCE_16(from->hInstance);
+ to->hInstance = HINSTANCE_16(MapHModuleLS(from->hInstance));
to->hMenu = HMENU_16(from->hMenu);
to->hwndParent = HWND_16(from->hwndParent);
to->cy = from->cy;
@@ -106,7 +106,7 @@ void STRUCT32_CREATESTRUCT16to32A( const
CREATESTRUCTA *to )
{
to->lpCreateParams = from->lpCreateParams;
- to->hInstance = HINSTANCE_32(from->hInstance);
+ to->hInstance = HINSTANCE_32(GetExePtr(from->hInstance));
to->hMenu = HMENU_32(from->hMenu);
to->hwndParent = WIN_Handle32(from->hwndParent);
to->cy = from->cy;
@@ -121,7 +121,7 @@ void STRUCT32_CREATESTRUCT16to32A( const
void STRUCT32_MDICREATESTRUCT32Ato16( const MDICREATESTRUCTA* from,
MDICREATESTRUCT16* to )
{
- to->hOwner = HINSTANCE_16(from->hOwner);
+ to->hOwner = MapHModuleLS(from->hOwner);
to->x = from->x;
to->y = from->y;
to->cx = from->cx;
@@ -133,7 +133,7 @@ void STRUCT32_MDICREATESTRUCT32Ato16( co
void STRUCT32_MDICREATESTRUCT16to32A( const MDICREATESTRUCT16* from,
MDICREATESTRUCTA *to )
{
- to->hOwner = HINSTANCE_32(from->hOwner);
+ to->hOwner = HINSTANCE_32(GetExePtr(from->hOwner));
to->x = from->x;
to->y = from->y;
to->cx = from->cx;
diff -u cvs/hq/wine/windows/winproc.c wine/windows/winproc.c
--- cvs/hq/wine/windows/winproc.c 2004-01-20 19:05:18.000000000 +0800
+++ wine/windows/winproc.c 2004-01-22 23:18:19.000000000 +0800
@@ -652,31 +652,25 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, U
case WM_CREATE:
{
UNICODE_STRING usBuffer;
- struct s
- { CREATESTRUCTW cs; /* new structure */
- LPCWSTR lpszName; /* allocated Name */
- LPCWSTR lpszClass; /* allocated Class */
- };
-
- struct s *xs = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct s));
- if (!xs) return -1;
- xs->cs = *(CREATESTRUCTW *)*plparam;
- if (HIWORD(xs->cs.lpszName))
+ CREATESTRUCTW *cs = (CREATESTRUCTW *)HeapAlloc(GetProcessHeap(), 0, sizeof(*cs));
+ if (!cs) return -1;
+ *cs = *(CREATESTRUCTW *)*plparam;
+ if (HIWORD(cs->lpszName))
{
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)xs->cs.lpszName);
- xs->lpszName = xs->cs.lpszName = usBuffer.Buffer;
+ RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)cs->lpszName);
+ cs->lpszName = usBuffer.Buffer;
}
- if (HIWORD(xs->cs.lpszClass))
+ if (HIWORD(cs->lpszClass))
{
- RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)xs->cs.lpszClass);
- xs->lpszClass = xs->cs.lpszClass = usBuffer.Buffer;
+ RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)cs->lpszClass);
+ cs->lpszClass = usBuffer.Buffer;
}
- if (GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
{
MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)HeapAlloc(GetProcessHeap(), 0,
sizeof(*mdi_cs));
- *mdi_cs = *(MDICREATESTRUCTW *)xs->cs.lpCreateParams;
+ *mdi_cs = *(MDICREATESTRUCTW *)cs->lpCreateParams;
if (HIWORD(mdi_cs->szTitle))
{
RtlCreateUnicodeStringFromAsciiz(&usBuffer, (LPCSTR)mdi_cs->szTitle);
@@ -687,10 +681,10 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, U
RtlCreateUnicodeStringFromAsciiz(&usBuffer, (LPCSTR)mdi_cs->szClass);
mdi_cs->szClass = usBuffer.Buffer;
}
- xs->cs.lpCreateParams = mdi_cs;
+ cs->lpCreateParams = mdi_cs;
}
- *plparam = (LPARAM)xs;
+ *plparam = (LPARAM)cs;
}
return 1;
case WM_MDICREATE:
@@ -840,25 +834,23 @@ LRESULT WINPROC_UnmapMsg32ATo32W( HWND h
case WM_NCCREATE:
case WM_CREATE:
{
- struct s
- { CREATESTRUCTW cs; /* new structure */
- LPWSTR lpszName; /* allocated Name */
- LPWSTR lpszClass; /* allocated Class */
- };
- struct s *xs = (struct s *)lParam;
- if (xs->lpszName) HeapFree( GetProcessHeap(), 0, xs->lpszName );
- if (xs->lpszClass) HeapFree( GetProcessHeap(), 0, xs->lpszClass );
+ CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam;
- if (GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ if (HIWORD(cs->lpszName))
+ HeapFree(GetProcessHeap(), 0, (LPVOID)cs->lpszName);
+ if (HIWORD(cs->lpszClass))
+ HeapFree(GetProcessHeap(), 0, (LPVOID)cs->lpszClass);
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
{
- MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)xs->cs.lpCreateParams;
+ MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)cs->lpCreateParams;
if (HIWORD(mdi_cs->szTitle))
HeapFree(GetProcessHeap(), 0, (LPVOID)mdi_cs->szTitle);
if (HIWORD(mdi_cs->szClass))
HeapFree(GetProcessHeap(), 0, (LPVOID)mdi_cs->szClass);
HeapFree(GetProcessHeap(), 0, mdi_cs);
}
- HeapFree( GetProcessHeap(), 0, xs );
+ HeapFree( GetProcessHeap(), 0, cs );
}
break;
@@ -982,7 +974,7 @@ INT WINPROC_MapMsg32WTo32A( HWND hwnd, U
cs->lpszClass = HEAP_strdupWtoA( GetProcessHeap(), 0,
(LPCWSTR)cs->lpszClass);
- if (GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
{
MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)HeapAlloc(GetProcessHeap(), 0,
sizeof(*mdi_cs));
@@ -1148,7 +1140,7 @@ void WINPROC_UnmapMsg32WTo32A( HWND hwnd
HeapFree( GetProcessHeap(), 0, (LPVOID)cs->lpszName );
if (HIWORD(cs->lpszClass))
HeapFree( GetProcessHeap(), 0, (LPVOID)cs->lpszClass );
- if (GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
{
MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs->lpCreateParams;
if (HIWORD(mdi_cs->szTitle))
@@ -1434,6 +1426,24 @@ INT WINPROC_MapMsg16To32A( HWND hwnd, UI
STRUCT32_CREATESTRUCT16to32A( cs16, cs );
cs->lpszName = MapSL(cs16->lpszName);
cs->lpszClass = MapSL(cs16->lpszClass);
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ {
+ MDICREATESTRUCT16 *mdi_cs16;
+ MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*mdi_cs));
+ if (!mdi_cs)
+ {
+ HeapFree(GetProcessHeap(), 0, cs);
+ return -1;
+ }
+ mdi_cs16 = (MDICREATESTRUCT16 *)MapSL((SEGPTR)cs16->lpCreateParams);
+ STRUCT32_MDICREATESTRUCT16to32A(mdi_cs16, mdi_cs);
+ mdi_cs->szTitle = MapSL(mdi_cs16->szTitle);
+ mdi_cs->szClass = MapSL(mdi_cs16->szClass);
+
+ cs->lpCreateParams = mdi_cs;
+ }
*(LPARAM *)(cs + 1) = *plparam; /* Store the previous lParam */
*plparam = (LPARAM)cs;
}
@@ -1638,6 +1648,10 @@ LRESULT WINPROC_UnmapMsg16To32A( HWND hw
CREATESTRUCTA *cs = (CREATESTRUCTA *)lParam;
lParam = *(LPARAM *)(cs + 1);
STRUCT32_CREATESTRUCT32Ato16( cs, MapSL(lParam) );
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ HeapFree(GetProcessHeap(), 0, cs->lpCreateParams);
+
HeapFree( GetProcessHeap(), 0, cs );
}
break;
@@ -1709,6 +1723,24 @@ INT WINPROC_MapMsg16To32W( HWND hwnd, UI
STRUCT32_CREATESTRUCT16to32A( cs16, (CREATESTRUCTA *)cs );
cs->lpszName = map_str_16_to_32W(cs16->lpszName);
cs->lpszClass = map_str_16_to_32W(cs16->lpszClass);
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ {
+ MDICREATESTRUCT16 *mdi_cs16;
+ MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*mdi_cs));
+ if (!mdi_cs)
+ {
+ HeapFree(GetProcessHeap(), 0, cs);
+ return -1;
+ }
+ mdi_cs16 = (MDICREATESTRUCT16 *)MapSL((SEGPTR)cs16->lpCreateParams);
+ STRUCT32_MDICREATESTRUCT16to32A(mdi_cs16, (MDICREATESTRUCTA *)mdi_cs);
+ mdi_cs->szTitle = map_str_16_to_32W(mdi_cs16->szTitle);
+ mdi_cs->szClass = map_str_16_to_32W(mdi_cs16->szClass);
+
+ cs->lpCreateParams = mdi_cs;
+ }
*(LPARAM *)(cs + 1) = *plparam; /* Store the previous lParam */
*plparam = (LPARAM)cs;
}
@@ -1812,6 +1844,14 @@ LRESULT WINPROC_UnmapMsg16To32W( HWND hw
STRUCT32_CREATESTRUCT32Ato16( (CREATESTRUCTA *)cs, MapSL(lParam) );
unmap_str_16_to_32W( cs->lpszName );
unmap_str_16_to_32W( cs->lpszClass );
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ {
+ MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)cs->lpCreateParams;
+ unmap_str_16_to_32W( mdi_cs->szTitle );
+ unmap_str_16_to_32W( mdi_cs->szClass );
+ HeapFree(GetProcessHeap(), 0, cs->lpCreateParams);
+ }
HeapFree( GetProcessHeap(), 0, cs );
}
break;
@@ -2180,7 +2220,7 @@ INT WINPROC_MapMsg32ATo16( HWND hwnd, UI
*plparam = MAKELPARAM( HIWORD(wParam32), (HMENU16)*plparam );
return 0;
case WM_MDIACTIVATE:
- if (GetWindowLongA( hwnd, GWL_EXSTYLE ) & WS_EX_MDICHILD)
+ if (GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_MDICHILD)
{
*pwparam16 = ((HWND)*plparam == hwnd);
*plparam = MAKELPARAM( (HWND16)LOWORD(*plparam),
@@ -2583,6 +2623,23 @@ INT WINPROC_MapMsg32WTo16( HWND hwnd, UI
STRUCT32_CREATESTRUCT32Ato16( (CREATESTRUCTA *)cs32, cs );
cs->lpszName = map_str_32W_to_16( cs32->lpszName );
cs->lpszClass = map_str_32W_to_16( cs32->lpszClass );
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ {
+ MDICREATESTRUCT16 *mdi_cs16;
+ MDICREATESTRUCTW *mdi_cs = (MDICREATESTRUCTW *)cs32->lpCreateParams;
+ mdi_cs16 = HeapAlloc(GetProcessHeap(), 0, sizeof(*mdi_cs16));
+ if (!mdi_cs16)
+ {
+ HeapFree(GetProcessHeap(), 0, cs);
+ return -1;
+ }
+ STRUCT32_MDICREATESTRUCT32Ato16((MDICREATESTRUCTA *)mdi_cs, mdi_cs16);
+ mdi_cs16->szTitle = map_str_32W_to_16(mdi_cs->szTitle);
+ mdi_cs16->szClass = map_str_32W_to_16(mdi_cs->szClass);
+
+ cs->lpCreateParams = mdi_cs16;
+ }
*plparam = MapLS(cs);
}
return 1;
@@ -2688,6 +2745,14 @@ void WINPROC_UnmapMsg32WTo16( HWND hwnd,
UnMapLS( p16->lParam );
unmap_str_32W_to_16( cs->lpszName );
unmap_str_32W_to_16( cs->lpszClass );
+
+ if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
+ {
+ MDICREATESTRUCT16 *mdi_cs16 = (MDICREATESTRUCT16 *)cs->lpCreateParams;
+ unmap_str_32W_to_16(mdi_cs16->szTitle);
+ unmap_str_32W_to_16(mdi_cs16->szClass);
+ HeapFree(GetProcessHeap(), 0, mdi_cs16);
+ }
HeapFree( GetProcessHeap(), 0, cs );
}
break;
@@ -2790,6 +2855,9 @@ LRESULT WINAPI __wine_call_wndproc_32A(
WPARAM wParam32;
HWND hwnd32 = WIN_Handle32( hwnd );
+ TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
+ func, hwnd32, SPY_GetMsgName(msg, hwnd32), wParam, lParam);
+
if (WINPROC_MapMsg16To32A( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0;
result = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam );
@@ -2808,6 +2876,9 @@ LRESULT WINAPI __wine_call_wndproc_32W(
WPARAM wParam32;
HWND hwnd32 = WIN_Handle32( hwnd );
+ TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
+ func, hwnd32, SPY_GetMsgName(msg, hwnd32), wParam, lParam);
+
if (WINPROC_MapMsg16To32W( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0;
result = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam );
More information about the wine-patches
mailing list