BOOL OpenFileDlg::Exec(char *target, int targ_size, char *title, char *filter, char *defaultDir, char *defaultExt) { if (targ_size <= 1) return FALSE; OPENFILENAME ofn; U8str fileName(targ_size); U8str dirName(targ_size); char *fname = NULL; if (*target && GetFullPathNameU8(target, targ_size, dirName.Buf(), &fname) != 0 && fname) { *(fname -1) = 0; strncpyz(fileName.Buf(), fname, targ_size); } else if (defaultDir) { strncpyz(dirName.Buf(), defaultDir, targ_size); } memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = parent ? parent->hWnd : NULL; ofn.lpstrFilter = filter; ofn.nFilterIndex = filter ? 1 : 0; ofn.lpstrFile = fileName.Buf(); ofn.lpstrDefExt = defaultExt; ofn.nMaxFile = targ_size; ofn.lpstrTitle = title; ofn.lpstrInitialDir = dirName.Buf(); ofn.lpfnHook = hook; ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|(hook ? OFN_ENABLEHOOK : 0); if (mode == OPEN || mode == MULTI_OPEN) ofn.Flags |= OFN_FILEMUSTEXIST | (mode == MULTI_OPEN ? OFN_ALLOWMULTISELECT : 0); else ofn.Flags |= (mode == NODEREF_SAVE ? OFN_NODEREFERENCELINKS : 0); ofn.Flags |= flags; U8str dirNameBak(targ_size); GetCurrentDirectoryU8(targ_size, dirNameBak.Buf()); BOOL ret = (mode == OPEN || mode == MULTI_OPEN) ? GetOpenFileNameU8(&ofn) : GetSaveFileNameU8(&ofn); SetCurrentDirectoryU8(dirNameBak.Buf()); if (ret) { if (mode == MULTI_OPEN) { memcpy(target, fileName.Buf(), targ_size); } else { strncpyz(target, ofn.lpstrFile, targ_size); } if (defaultDir) strncpyz(defaultDir, ofn.lpstrFile, ofn.nFileOffset); } return ret; }
BOOL OpenFileDlg::Exec(char *target, char *title, char *filter, char *defaultDir) { OPENFILENAME ofn; char szDirName[MAX_BUF_EX] = "", szFile[MAX_BUF_EX] = "", *fname = NULL; if (*target && GetFullPathNameU8(target, MAX_BUF, szDirName, &fname) != 0 && fname) *(fname -1) = 0, strncpyz(szFile, fname, MAX_PATH_U8); else if (defaultDir) strncpyz(szDirName, defaultDir, MAX_PATH_U8); memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = parent ? parent->hWnd : NULL; ofn.lpstrFilter = filter; ofn.nFilterIndex = filter ? 1 : 0; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrTitle = title; ofn.lpstrInitialDir = szDirName; ofn.lpfnHook = hook; ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|(hook ? OFN_ENABLEHOOK : 0); if (mode == OPEN || mode == MULTI_OPEN) ofn.Flags |= OFN_FILEMUSTEXIST | (mode == MULTI_OPEN ? OFN_ALLOWMULTISELECT : 0); else ofn.Flags |= (mode == NODEREF_SAVE ? OFN_NODEREFERENCELINKS : 0); char dirNameBak[MAX_PATH_U8]; GetCurrentDirectoryU8(sizeof(dirNameBak), dirNameBak); BOOL ret = (mode == OPEN || mode == MULTI_OPEN) ? GetOpenFileNameU8(&ofn) : GetSaveFileNameU8(&ofn); SetCurrentDirectoryU8(dirNameBak); if (ret) { if (mode == MULTI_OPEN) memcpy(target, szFile, sizeof(szFile)); else strncpyz(target, ofn.lpstrFile, MAX_PATH_U8); if (defaultDir) strncpyz(defaultDir, ofn.lpstrFile, ofn.nFileOffset); } return ret; }