Hi All,
These two patches and the following registry key should get MSVC 6 to install with version = win98.
have fun,
Mike
[Software\\Microsoft\\Windows\\CurrentVersion] "WindowsVersion"="Windows 98" "VersionNumber"="4.10.1998"
ChangeLog: * preserve A/W when creating propsheet dialogs * nul parameters need to be quoted on the commandline
? ch.diff ? ch4.diff ? fd_fix.diff ? file_change.diff ? filedlg95.jpg ? np.diff ? np2.diff ? ntdll_slash.diff ? total-20030221.diff ? total-20030223.diff ? total-20030304.diff ? total-20030609.diff ? total-msvc.diff ? server/x3 Index: dlls/comctl32/propsheet.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/propsheet.c,v retrieving revision 1.84 diff -u -r1.84 propsheet.c --- dlls/comctl32/propsheet.c 18 Jun 2003 19:45:23 -0000 1.84 +++ dlls/comctl32/propsheet.c 3 Jul 2003 20:19:24 -0000 @@ -78,6 +78,7 @@ { HWND hwnd; PROPSHEETHEADERW ppshheader; + BOOL unicode; LPWSTR strPropertiesFor; int nPages; int active_page; @@ -109,6 +110,8 @@ const WCHAR PropSheetInfoStr[] = {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 }; +#define PSP_INTERNAL_UNICODE 0x80000000 + #define MAX_CAPTION_LENGTH 255 #define MAX_TABTEXT_LENGTH 255 #define MAX_BUTTONTEXT_LENGTH 64 @@ -412,7 +415,7 @@ */ if (dwFlags & PSP_DLGINDIRECT) pTemplate = (DLGTEMPLATE*)lppsp->u.pResource; - else + else if(dwFlags & PSP_INTERNAL_UNICODE ) { HRSRC hResource = FindResourceW(lppsp->hInstance, lppsp->u.pszTemplate, @@ -421,6 +424,15 @@ hResource); pTemplate = (LPDLGTEMPLATEW)LockResource(hTemplate); } + else + { + HRSRC hResource = FindResourceA(lppsp->hInstance, + (LPSTR)lppsp->u.pszTemplate, + RT_DIALOGA); + HGLOBAL hTemplate = LoadResource(lppsp->hInstance, + hResource); + pTemplate = (LPDLGTEMPLATEA)LockResource(hTemplate); + } /* * Extract the size of the page and the caption. @@ -565,10 +577,20 @@ if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) resID = IDD_WIZARD; - if(!(hRes = FindResourceW(COMCTL32_hModule, + if( psInfo->unicode ) + { + if(!(hRes = FindResourceW(COMCTL32_hModule, MAKEINTRESOURCEW(resID), RT_DIALOGW))) - return -1; + return -1; + } + else + { + if(!(hRes = FindResourceA(COMCTL32_hModule, + MAKEINTRESOURCEA(resID), + RT_DIALOGA))) + return -1; + } if(!(template = (LPVOID)LoadResource(COMCTL32_hModule, hRes))) return -1; @@ -588,20 +610,41 @@ if (psInfo->useCallback) (*(psInfo->ppshheader.pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp); - if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS)) + if( psInfo->unicode ) + { + if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS)) ret = DialogBoxIndirectParamW(psInfo->ppshheader.hInstance, (LPDLGTEMPLATEW) temp, psInfo->ppshheader.hwndParent, PROPSHEET_DialogProc, (LPARAM)psInfo); - else - { + else + { ret = (int)CreateDialogIndirectParamW(psInfo->ppshheader.hInstance, (LPDLGTEMPLATEW) temp, psInfo->ppshheader.hwndParent, PROPSHEET_DialogProc, (LPARAM)psInfo); if ( !ret ) ret = -1; + } + } + else + { + if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS)) + ret = DialogBoxIndirectParamA(psInfo->ppshheader.hInstance, + (LPDLGTEMPLATEA) temp, + psInfo->ppshheader.hwndParent, + PROPSHEET_DialogProc, + (LPARAM)psInfo); + else + { + ret = (int)CreateDialogIndirectParamA(psInfo->ppshheader.hInstance, + (LPDLGTEMPLATEA) temp, + psInfo->ppshheader.hwndParent, + PROPSHEET_DialogProc, + (LPARAM)psInfo); + if ( !ret ) ret = -1; + } } COMCTL32_Free(temp); @@ -1342,7 +1385,7 @@ pTemplate = (DLGTEMPLATE*)ppshpage->u.pResource; resSize = GetTemplateSize(pTemplate); } - else + else if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE) { HRSRC hResource; HANDLE hTemplate; @@ -1364,6 +1407,28 @@ * Make a copy of the dialog template to make it writable */ } + else + { + HRSRC hResource; + HANDLE hTemplate; + + hResource = FindResourceA(ppshpage->hInstance, + (LPSTR)ppshpage->u.pszTemplate, + RT_DIALOGA); + if(!hResource) + return FALSE; + + resSize = SizeofResource(ppshpage->hInstance, hResource); + + hTemplate = LoadResource(ppshpage->hInstance, hResource); + if(!hTemplate) + return FALSE; + + pTemplate = (LPDLGTEMPLATEA)LockResource(hTemplate); + /* + * Make a copy of the dialog template to make it writable + */ + } temp = COMCTL32_Alloc(resSize); if (!temp) return FALSE; @@ -1400,7 +1465,14 @@ PSPCB_CREATE, (LPPROPSHEETPAGEW)ppshpage); - hwndPage = CreateDialogIndirectParamW(ppshpage->hInstance, + if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE) + hwndPage = CreateDialogIndirectParamW(ppshpage->hInstance, + pTemplate, + hwndParent, + ppshpage->pfnDlgProc, + (LPARAM)ppshpage); + else + hwndPage = CreateDialogIndirectParamA(ppshpage->hInstance, pTemplate, hwndParent, ppshpage->pfnDlgProc, @@ -2421,6 +2493,7 @@ } } + psInfo->unicode = FALSE; bRet = PROPSHEET_CreateDialog(psInfo); return bRet; @@ -2465,6 +2538,7 @@ } } + psInfo->unicode = TRUE; bRet = PROPSHEET_CreateDialog(psInfo); return bRet; @@ -2481,9 +2555,13 @@ memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEA))); + ppsp->dwFlags &= ~ PSP_INTERNAL_UNICODE; if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) && HIWORD( ppsp->u.pszTemplate ) ) { - PROPSHEET_AtoW(&ppsp->u.pszTemplate, lpPropSheetPage->u.pszTemplate); + int len = strlen(lpPropSheetPage->u.pszTemplate); + + ppsp->u.pszTemplate = HeapAlloc( GetProcessHeap(),0,len+1 ); + strcpy( (LPSTR)ppsp->u.pszTemplate, lpPropSheetPage->u.pszTemplate ); } if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) ) { @@ -2508,6 +2586,8 @@ PROPSHEETPAGEW* ppsp = COMCTL32_Alloc(sizeof(PROPSHEETPAGEW)); memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEW))); + + ppsp->dwFlags |= PSP_INTERNAL_UNICODE; if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) && HIWORD( ppsp->u.pszTemplate ) ) {
Index: dlls/ntdll/env.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/env.c,v retrieving revision 1.3 diff -u -r1.3 env.c --- dlls/ntdll/env.c 18 Jun 2003 03:23:22 -0000 1.3 +++ dlls/ntdll/env.c 3 Jul 2003 20:19:25 -0000 @@ -538,6 +538,7 @@ has_space=0; bcount=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a=='\\') { bcount++; @@ -573,6 +574,7 @@ /* Check for quotes and spaces in this argument */ has_space=has_quote=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a==' ' || *a=='\t') { has_space=1; Index: programs/wcmd/wcmdmain.c =================================================================== RCS file: /home/wine/wine/programs/wcmd/wcmdmain.c,v retrieving revision 1.28 diff -u -r1.28 wcmdmain.c --- programs/wcmd/wcmdmain.c 11 May 2003 02:48:17 -0000 1.28 +++ programs/wcmd/wcmdmain.c 3 Jul 2003 20:19:25 -0000 @@ -97,6 +97,7 @@ has_space=0; bcount=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a=='\\') { bcount++; @@ -131,6 +132,7 @@ /* Check for quotes and spaces in this argument */ has_space=has_quote=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a==' ' || *a=='\t') { has_space=1; Index: programs/winevdm/winevdm.c =================================================================== RCS file: /home/wine/wine/programs/winevdm/winevdm.c,v retrieving revision 1.2 diff -u -r1.2 winevdm.c --- programs/winevdm/winevdm.c 2 May 2003 20:11:52 -0000 1.2 +++ programs/winevdm/winevdm.c 3 Jul 2003 20:19:25 -0000 @@ -48,6 +48,7 @@ has_space=0; bcount=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a=='\\') { bcount++; @@ -82,6 +83,7 @@ /* Check for quotes and spaces in this argument */ has_space=has_quote=0; a=*arg; + if( !*a ) has_space=1; while (*a!='\0') { if (*a==' ' || *a=='\t') { has_space=1;