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