PATCH - comdlg32 filedlg win16/32 split

Steven Edwards Steven_Ed4153 at yahoo.com
Wed Jun 25 20:50:59 CDT 2003


Hello,
Well this is it. Other then in the print dialogs all of the internal 
Win16isms are GONE!!!! In a few days I will start on the print dialogs 
again.

Now if only it will work =)
Thanks
Steven

Changelog:
Remove calls to FindResource16, FreeResource16, GlobalAlloc16, GlobalFree16
GlobalLock16, GlobalUnLock16, LoadResource16 when building as a 32 bit dll.
Create new internal functions FILEDLG_MapOfnStruct16 and  
FILEDLG_DestroyPrivate16.
Share a few other internal functions with the 16 bit commdlg.

-------------- next part --------------
Index: filedlg.h
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/filedlg.h,v
retrieving revision 1.2
diff -u -r1.2 filedlg.h
--- filedlg.h	24 Jun 2003 19:24:29 -0000	1.2
+++ filedlg.h	26 Jun 2003 01:43:40 -0000
@@ -60,6 +60,7 @@
 
 LPWSTR FILEDLG_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index);
 void FILEDLG_MapDrawItemStruct(LPDRAWITEMSTRUCT16 lpdis16, LPDRAWITEMSTRUCT lpdis);
+void FILEDLG_MapOfnStructA(LPOPENFILENAMEA ofnA, LPOPENFILENAMEW ofnW, BOOL open);
 BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath);
 LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,
        int savedlg, LPDRAWITEMSTRUCT lpdis);

Index: filedlg.c
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/filedlg.c,v
retrieving revision 1.64
diff -u -r1.64 filedlg.c
--- filedlg.c	24 Jun 2003 19:24:29 -0000	1.64
+++ filedlg.c	26 Jun 2003 01:43:48 -0000
@@ -155,81 +155,6 @@
     return TRUE;
 }
 
-
-/***********************************************************************
- *           Get16BitsTemplate                                [internal]
- *
- * Get a template (FALSE if failure) when 16 bits dialogs are used
- * by a 16 bits application
- *
- */
-BOOL Get16BitsTemplate(LFSPRIVATE lfs)
-{
-    LPOPENFILENAME16 ofn16 = lfs->ofn16;
-    LPCVOID template;
-    HGLOBAL16 hGlobal16 = 0;
-
-    if (ofn16->Flags & OFN_ENABLETEMPLATEHANDLE)
-        lfs->hDlgTmpl16 = ofn16->hInstance;
-    else if (ofn16->Flags & OFN_ENABLETEMPLATE)
-    {
-	HANDLE16 hResInfo;
-	if (!(hResInfo = FindResource16(ofn16->hInstance,
-					MapSL(ofn16->lpTemplateName),
-                                        RT_DIALOGA)))
-	{
-	    COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
-	    return FALSE;
-	}
-	if (!(lfs->hDlgTmpl16 = LoadResource16( ofn16->hInstance, hResInfo )))
-	{
-	    COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
-	    return FALSE;
-	}
-        lfs->hResource16 = lfs->hDlgTmpl16;
-    }
-    else
-    { /* get resource from (32 bits) own Wine resource; convert it to 16 */
-	HRSRC hResInfo;
-	HGLOBAL hDlgTmpl32;
-        LPCVOID template32;
-        DWORD size;
-
-	if (!(hResInfo = FindResourceA(COMDLG32_hInstance,
-               lfs->open ? "OPEN_FILE":"SAVE_FILE", RT_DIALOGA)))
-	{
-	    COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
-	    return FALSE;
-	}
-	if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo )) ||
-	    !(template32 = LockResource( hDlgTmpl32 )))
-	{
-	    COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
-	    return FALSE;
-	}
-        size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
-        hGlobal16 = GlobalAlloc16(0, size);
-        if (!hGlobal16)
-        {
-            COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
-            ERR("alloc failure for %ld bytes\n", size);
-            return FALSE;
-        }
-        template = GlobalLock16(hGlobal16);
-        if (!template)
-        {
-            COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
-            ERR("global lock failure for %x handle\n", hGlobal16);
-            GlobalFree16(hGlobal16);
-            return FALSE;
-        }
-        ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
-        lfs->hDlgTmpl16 = hGlobal16;
-        lfs->hGlobal16 = hGlobal16;
-    }
-    return TRUE;
-}
-
 /***********************************************************************
  *                              FILEDLG_StripEditControl        [internal]
  * Strip pathnames off the contents of the edit control.
@@ -1107,44 +1032,6 @@
     }
 }
 
-
-/************************************************************************
- *                              FILEDLG_MapOfnStruct16          [internal]
- *      map a 16 bits structure to an Unicode one
- */
-void FILEDLG_MapOfnStruct16(LPOPENFILENAME16 ofn16, LPOPENFILENAMEW ofnW, BOOL open)
-{
-    OPENFILENAMEA ofnA;
-    /* first convert to linear pointers */
-    memset(&ofnA, 0, sizeof(OPENFILENAMEA));
-    ofnA.lStructSize = sizeof(OPENFILENAMEA);
-    ofnA.hwndOwner = HWND_32(ofn16->hwndOwner);
-    ofnA.hInstance = HINSTANCE_32(ofn16->hInstance);
-    if (ofn16->lpstrFilter)
-        ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter);
-    if (ofn16->lpstrCustomFilter)
-        ofnA.lpstrCustomFilter = MapSL(ofn16->lpstrCustomFilter);
-    ofnA.nMaxCustFilter = ofn16->nMaxCustFilter;
-    ofnA.nFilterIndex = ofn16->nFilterIndex;
-    ofnA.lpstrFile = MapSL(ofn16->lpstrFile);
-    ofnA.nMaxFile = ofn16->nMaxFile;
-    ofnA.lpstrFileTitle = MapSL(ofn16->lpstrFileTitle);
-    ofnA.nMaxFileTitle = ofn16->nMaxFileTitle;
-    ofnA.lpstrInitialDir = MapSL(ofn16->lpstrInitialDir);
-    ofnA.lpstrTitle = MapSL(ofn16->lpstrTitle);
-    ofnA.Flags = ofn16->Flags;
-    ofnA.nFileOffset = ofn16->nFileOffset;
-    ofnA.nFileExtension = ofn16->nFileExtension;
-    ofnA.lpstrDefExt = MapSL(ofn16->lpstrDefExt);
-    if (HIWORD(ofn16->lpTemplateName))
-        ofnA.lpTemplateName = MapSL(ofn16->lpTemplateName);
-    else
-        ofnA.lpTemplateName = (LPSTR) ofn16->lpTemplateName; /* ressource number */
-    /* now calls the 32 bits Ansi to Unicode version to complete the job */
-    FILEDLG_MapOfnStructA(&ofnA, ofnW, open);
-}
-
-
 /************************************************************************
  *                              FILEDLG_DestroyPrivate            [internal]
  *      destroys the private object
@@ -1154,15 +1041,8 @@
     HWND hwnd;
     if (!lfs) return;
     hwnd = lfs->hwnd;
-    /* free resources for a 16 bits dialog */
-    if (lfs->hResource16) FreeResource16(lfs->hResource16);
-    if (lfs->hGlobal16)
-    {
-        GlobalUnlock16(lfs->hGlobal16);
-        GlobalFree16(lfs->hGlobal16);
-    }
     /* if ofnW has been allocated, have to free everything in it */
-    if (lfs->ofn16 || lfs->ofnA)
+    if (lfs->ofnA)
     {
        LPOPENFILENAMEW ofnW = lfs->ofnW;
        if (ofnW->lpstrFilter) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrFilter);
@@ -1185,7 +1065,7 @@
  *      allocate a private object to hold 32 bits Unicode
  *      structure that will be used throughtout the calls, while
  *      keeping available the original structures and a few variables
- *      On entry : type = dialog procedure type (16,32A,32W)
+ *      On entry : type = dialog procedure type (32A,32W)
  *                 dlgType = dialog type (open or save)
  */
 LFSPRIVATE FILEDLG_AllocPrivate(LPARAM lParam, int type, UINT dlgType)
@@ -1204,14 +1084,6 @@
     lfs->fileokstring = RegisterWindowMessageA(FILEOKSTRINGA);
     switch(type)
     {
-        case LFS16:
-        lfs->ofn16 = MapSL(lParam);
-        if (lfs->ofn16->Flags & OFN_ENABLEHOOK)
-            if (lfs->ofn16->lpfnHook)
-                lfs->hook = TRUE;
-
-        break;
-
         case LFS32A:
         lfs->ofnA = (LPOPENFILENAMEA) lParam;
         if (lfs->ofnA->Flags & OFN_ENABLEHOOK)
@@ -1232,20 +1104,13 @@
         lfs->ofnW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OPENFILENAMEW));
         if (lfs->ofnW)
         {
-            if (lfs->ofn16)
-                FILEDLG_MapOfnStruct16(lfs->ofn16, lfs->ofnW, lfs->open);
             if (lfs->ofnA)
                 FILEDLG_MapOfnStructA(lfs->ofnA, lfs->ofnW, lfs->open);
         }
         else
             ret = NULL;
     }
-    if (lfs->ofn16)
-    {
-        if (!Get16BitsTemplate(lfs)) ret = NULL;
-    }
-    else
-        if (!Get32BitsTemplate(lfs)) ret = NULL;
+    if (!Get32BitsTemplate(lfs)) ret = NULL;
     if (!ret) FILEDLG_DestroyPrivate(lfs);
     return ret;
 }

Index: filedlg16.c
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/filedlg16.c,v
retrieving revision 1.2
diff -u -r1.2 filedlg16.c
--- filedlg16.c	24 Jun 2003 19:24:29 -0000	1.2
+++ filedlg16.c	26 Jun 2003 01:43:56 -0000
@@ -184,6 +184,195 @@
     return TRUE;
 }
 
+/***********************************************************************
+ *           Get16BitsTemplate                                [internal]
+ *
+ * Get a template (FALSE if failure) when 16 bits dialogs are used
+ * by a 16 bits application
+ *
+ */
+BOOL Get16BitsTemplate(LFSPRIVATE lfs)
+{
+    LPOPENFILENAME16 ofn16 = lfs->ofn16;
+    LPCVOID template;
+    HGLOBAL16 hGlobal16 = 0;
+
+    if (ofn16->Flags & OFN_ENABLETEMPLATEHANDLE)
+        lfs->hDlgTmpl16 = ofn16->hInstance;
+    else if (ofn16->Flags & OFN_ENABLETEMPLATE)
+    {
+	HANDLE16 hResInfo;
+	if (!(hResInfo = FindResource16(ofn16->hInstance,
+					MapSL(ofn16->lpTemplateName),
+                                        RT_DIALOGA)))
+	{
+	    COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
+	    return FALSE;
+	}
+	if (!(lfs->hDlgTmpl16 = LoadResource16( ofn16->hInstance, hResInfo )))
+	{
+	    COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+	    return FALSE;
+	}
+        lfs->hResource16 = lfs->hDlgTmpl16;
+    }
+    else
+    { /* get resource from (32 bits) own Wine resource; convert it to 16 */
+	HRSRC hResInfo;
+	HGLOBAL hDlgTmpl32;
+        LPCVOID template32;
+        DWORD size;
+
+	if (!(hResInfo = FindResourceA(COMDLG32_hInstance,
+               lfs->open ? "OPEN_FILE":"SAVE_FILE", RT_DIALOGA)))
+	{
+	    COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
+	    return FALSE;
+	}
+	if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo )) ||
+	    !(template32 = LockResource( hDlgTmpl32 )))
+	{
+	    COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+	    return FALSE;
+	}
+        size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo);
+        hGlobal16 = GlobalAlloc16(0, size);
+        if (!hGlobal16)
+        {
+            COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
+            ERR("alloc failure for %ld bytes\n", size);
+            return FALSE;
+        }
+        template = GlobalLock16(hGlobal16);
+        if (!template)
+        {
+            COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
+            ERR("global lock failure for %x handle\n", hGlobal16);
+            GlobalFree16(hGlobal16);
+            return FALSE;
+        }
+        ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
+        lfs->hDlgTmpl16 = hGlobal16;
+        lfs->hGlobal16 = hGlobal16;
+    }
+    return TRUE;
+}
+
+/************************************************************************
+ *                              FILEDLG_MapOfnStruct16          [internal]
+ *      map a 16 bits structure to an Unicode one
+ */
+void FILEDLG_MapOfnStruct16(LPOPENFILENAME16 ofn16, LPOPENFILENAMEW ofnW, BOOL open)
+{
+    OPENFILENAMEA ofnA;
+    /* first convert to linear pointers */
+    memset(&ofnA, 0, sizeof(OPENFILENAMEA));
+    ofnA.lStructSize = sizeof(OPENFILENAMEA);
+    ofnA.hwndOwner = HWND_32(ofn16->hwndOwner);
+    ofnA.hInstance = HINSTANCE_32(ofn16->hInstance);
+    if (ofn16->lpstrFilter)
+        ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter);
+    if (ofn16->lpstrCustomFilter)
+        ofnA.lpstrCustomFilter = MapSL(ofn16->lpstrCustomFilter);
+    ofnA.nMaxCustFilter = ofn16->nMaxCustFilter;
+    ofnA.nFilterIndex = ofn16->nFilterIndex;
+    ofnA.lpstrFile = MapSL(ofn16->lpstrFile);
+    ofnA.nMaxFile = ofn16->nMaxFile;
+    ofnA.lpstrFileTitle = MapSL(ofn16->lpstrFileTitle);
+    ofnA.nMaxFileTitle = ofn16->nMaxFileTitle;
+    ofnA.lpstrInitialDir = MapSL(ofn16->lpstrInitialDir);
+    ofnA.lpstrTitle = MapSL(ofn16->lpstrTitle);
+    ofnA.Flags = ofn16->Flags;
+    ofnA.nFileOffset = ofn16->nFileOffset;
+    ofnA.nFileExtension = ofn16->nFileExtension;
+    ofnA.lpstrDefExt = MapSL(ofn16->lpstrDefExt);
+    if (HIWORD(ofn16->lpTemplateName))
+        ofnA.lpTemplateName = MapSL(ofn16->lpTemplateName);
+    else
+        ofnA.lpTemplateName = (LPSTR) ofn16->lpTemplateName; /* ressource number */
+    /* now calls the 32 bits Ansi to Unicode version to complete the job */
+    FILEDLG_MapOfnStructA(&ofnA, ofnW, open);
+}
+
+/************************************************************************
+ *                              FILEDLG_DestroyPrivate            [internal]
+ *      destroys the private object
+ */
+void FILEDLG_DestroyPrivate16(LFSPRIVATE lfs)
+{
+    HWND hwnd;
+    if (!lfs) return;
+    hwnd = lfs->hwnd;
+    /* free resources for a 16 bits dialog */
+    if (lfs->hResource16) FreeResource16(lfs->hResource16);
+    if (lfs->hGlobal16)
+    {
+        GlobalUnlock16(lfs->hGlobal16);
+        GlobalFree16(lfs->hGlobal16);
+    }
+    /* if ofnW has been allocated, have to free everything in it */
+    if (lfs->ofn16)
+    {
+       LPOPENFILENAMEW ofnW = lfs->ofnW;
+       if (ofnW->lpstrFilter) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrFilter);
+       if (ofnW->lpstrCustomFilter) HeapFree(GetProcessHeap(), 0, ofnW->lpstrCustomFilter);
+       if (ofnW->lpstrFile) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFile);
+       if (ofnW->lpstrFileTitle) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFileTitle);
+       if (ofnW->lpstrInitialDir) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrInitialDir);
+       if (ofnW->lpstrTitle) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrTitle);
+       if ((ofnW->lpTemplateName) && (HIWORD(ofnW->lpTemplateName)))
+           HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpTemplateName);
+       HeapFree(GetProcessHeap(), 0, ofnW);
+    }
+    TRACE("destroying private allocation %p\n", lfs);
+    HeapFree(GetProcessHeap(), 0, lfs);
+    RemovePropA(hwnd, OFN_PROP);
+}
+
+/************************************************************************
+ *                              FILEDLG_AllocPrivate16            [internal]
+ *      allocate a 16 bit private object to hold 32 bits Unicode
+ *      structure that will be used throughtout the calls, while
+ *      keeping available the original structures and a few variables
+ *      On entry : dlgType = dialog type (open or save)
+ *                 
+ */
+LFSPRIVATE FILEDLG_AllocPrivate16(LPARAM lParam, UINT dlgType)
+{
+    LFSPRIVATE lfs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FSPRIVATE));
+    LFSPRIVATE ret;
+    TRACE("alloc private buf %p\n", lfs);
+    if (!lfs) return NULL;
+    lfs->hook = FALSE;
+    lfs->lParam = lParam;
+    if (dlgType == OPEN_DIALOG)
+        lfs->open = TRUE;
+    else
+        lfs->open = FALSE;
+    lfs->lbselchstring = RegisterWindowMessageA(LBSELCHSTRINGA);
+    lfs->fileokstring = RegisterWindowMessageA(FILEOKSTRINGA);
+    lfs->ofn16 = MapSL(lParam);
+
+    if (lfs->ofn16->Flags & OFN_ENABLEHOOK)
+	    if (lfs->ofn16->lpfnHook)
+    		lfs->hook = TRUE;
+    ret = lfs;
+    if (!lfs->ofnW)
+    { /* this structure is needed internally, so create it */
+        lfs->ofnW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OPENFILENAMEW));
+        if (lfs->ofnW)
+        {
+            if (lfs->ofn16)
+                FILEDLG_MapOfnStruct16(lfs->ofn16, lfs->ofnW, lfs->open);
+        }
+        else
+            ret = NULL;
+    }
+    if (!Get16BitsTemplate(lfs)) ret = NULL;
+    if (!ret) FILEDLG_DestroyPrivate16(lfs);
+    return ret;
+}
+
 /* ------------------ Dialog procedures ---------------------- */
 
 /***********************************************************************
@@ -312,14 +501,14 @@
 
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, OPEN_DIALOG);
+    lfs = FILEDLG_AllocPrivate16((LPARAM) ofn, OPEN_DIALOG);
     if (lfs)
     {
         hInst = GetWindowWord( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE );
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 6);
         bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner,
                                          (DLGPROC16) ptr, (LPARAM) lfs);
-        FILEDLG_DestroyPrivate(lfs);
+        FILEDLG_DestroyPrivate16(lfs);
     }
 
     TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile));
@@ -350,14 +539,14 @@
 
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, SAVE_DIALOG);
+    lfs = FILEDLG_AllocPrivate16((LPARAM) ofn, SAVE_DIALOG);
     if (lfs)
     {
         hInst = GetWindowWord( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE );
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 7);
         bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner,
                                          (DLGPROC16) ptr, (LPARAM) lfs);
-        FILEDLG_DestroyPrivate(lfs);
+        FILEDLG_DestroyPrivate16(lfs);
     }
 
     TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile));



More information about the wine-devel mailing list