PATCH: GetFileDialog95A/W (comdlg32)
Sander van Leeuwen
sandervl at xs4all.nl
Sun Jun 9 06:39:25 CDT 2002
Changelog:
- save and restore current directory in GetFileDialog95W if OFN_NOCHANGEDIR flag set
- GetFileDialog95W: only convert ofn->lpTemplateName if it's a string resource id
(fixes OpenOffice 1.0 file open dialog crash)
- Ignore OFN_FILEMUSTEXIST flag for save file dialog
(fixes save dialog in ElstarFormular)
- Rewrote casts that some compilers don't accept
Author: Sander van Leeuwen (sandervl at xs4all.nl)
--- filedlg95.c Fri Jun 7 08:13:40 2002
+++ filedlg95.cn Sun Jun 9 13:26:56 2002
@@ -330,6 +330,7 @@
break;
case SAVE_DIALOG :
fodInfos->DlgInfos.dwDlgProp |= FODPROP_SAVEDLG;
+ ofn->Flags &= ~OFN_FILEMUSTEXIST;
ret = GetFileName95(fodInfos);
break;
default :
@@ -403,6 +404,7 @@
BOOL ret;
FileOpenDlgInfos *fodInfos;
HINSTANCE hInstance;
+ LPSTR lpstrSavDir = NULL;
/* out arguments */
LPWSTR lpstrFile = NULL;
@@ -444,7 +446,7 @@
len = WideCharToMultiByte( CP_ACP, 0, ofn->lpstrFilter, n, NULL, 0, NULL, NULL );
y = (LPSTR)MemAlloc(len);
WideCharToMultiByte( CP_ACP, 0, ofn->lpstrFilter, n, y, len, NULL, NULL );
- (LPSTR)ofn->lpstrFilter = y;
+ ofn->lpstrFilter = (LPWSTR)y;
}
/* convert lpstrCustomFilter */
@@ -463,7 +465,7 @@
len = WideCharToMultiByte( CP_ACP, 0, ofn->lpstrCustomFilter, n, NULL, 0, NULL, NULL );
y = (LPSTR)MemAlloc(len);
WideCharToMultiByte( CP_ACP, 0, ofn->lpstrCustomFilter, n, y, len, NULL, NULL );
- (LPSTR)ofn->lpstrCustomFilter = y;
+ ofn->lpstrCustomFilter = (LPWSTR)y;
}
/* convert string arguments, save others */
@@ -472,10 +474,21 @@
AllocInArgWtoA(ofn->lpstrInitialDir, lpstrInitialDir);
AllocInArgWtoA(ofn->lpstrTitle, lpstrTitle);
AllocInArgWtoA(ofn->lpstrDefExt, lpstrDefExt);
- AllocInArgWtoA(ofn->lpTemplateName, lpTemplateName);
+ if(HIWORD(ofn->lpTemplateName)) {
+ AllocInArgWtoA(ofn->lpTemplateName, lpTemplateName);
+ }
+ else lpTemplateName = ofn->lpTemplateName;
+
dwFlags = ofn->Flags;
hInstance = ofn->hInstance;
+ /* save current directory */
+ if (ofn->Flags & OFN_NOCHANGEDIR)
+ {
+ lpstrSavDir = MemAlloc(MAX_PATH);
+ GetCurrentDirectoryA(MAX_PATH, lpstrSavDir);
+ }
+
ofn->Flags = ofn->Flags|OFN_WINE|OFN_UNICODE;
ofn->hInstance = MapHModuleLS(ofn->hInstance);
@@ -486,12 +499,19 @@
break;
case SAVE_DIALOG :
fodInfos->DlgInfos.dwDlgProp |= FODPROP_SAVEDLG;
+ ofn->Flags &= ~OFN_FILEMUSTEXIST;
ret = GetFileName95(fodInfos);
break;
default :
ret = 0;
}
+ if (lpstrSavDir)
+ {
+ SetCurrentDirectoryA(lpstrSavDir);
+ MemFree(lpstrSavDir);
+ }
+
/* restore saved IN arguments and convert OUT arguments back */
ofn->Flags = dwFlags;
ofn->hInstance = hInstance;
@@ -502,8 +522,10 @@
FreeInArg(ofn->lpstrInitialDir, lpstrInitialDir);
FreeInArg(ofn->lpstrTitle, lpstrTitle);
FreeInArg(ofn->lpstrDefExt, lpstrDefExt);
- FreeInArg(ofn->lpTemplateName, lpTemplateName);
-
+ if(HIWORD(lpTemplateName)) {
+ FreeInArg(ofn->lpTemplateName, lpTemplateName);
+ }
+ else ofn->lpTemplateName = lpTemplateName;
MemFree((LPVOID)(fodInfos));
return ret;
}
More information about the wine-patches
mailing list