1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-11 11:08:02 -06:00

Windows: Replace legacy file/dir selection APIs with modern IFileDialog interface

We remove usage of GetOpenFileNameW/GetSaveFileNameW/SHBrowseForFolderW which are deprecated by Microsoft
This commit is contained in:
Mounir IDRASSI
2023-09-03 23:42:41 +02:00
parent 201d09ff5a
commit 2a6726b00e
7 changed files with 321 additions and 247 deletions

View File

@@ -4964,47 +4964,104 @@ void ResetCurrentDirectory ()
} }
BOOL BrowseFiles (HWND hwndDlg, char *stringId, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter) BOOL BrowseFiles (HWND hwndDlg, char *stringId, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode)
{ {
return BrowseFilesInDir (hwndDlg, stringId, NULL, lpszFileName, keepHistory, saveMode, browseFilter); return BrowseFilesInDir (hwndDlg, stringId, NULL, lpszFileName, keepHistory, saveMode, NULL);
} }
BOOL BrowseFilesInDir(HWND hwndDlg, char *stringId, wchar_t *initialDir, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter, const wchar_t *initialFileName, const wchar_t *defaultExtension) BOOL BrowseFilesInDir(HWND hwndDlg, char *stringId, wchar_t *initialDir, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter, const wchar_t *initialFileName, const wchar_t *defaultExtension)
{ {
OPENFILENAMEW ofn; IFileDialog *pfd = NULL;
wchar_t file[TC_MAX_PATH] = { 0 }; HRESULT hr;
wchar_t filter[1024]; wchar_t filter[1024];
BOOL status = FALSE; BOOL status = FALSE;
CoInitialize (NULL); hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr))
{
return FALSE;
}
ZeroMemory (&ofn, sizeof (ofn)); // Choose between the File Open or File Save dialog depending on the saveMode.
*lpszFileName = 0; if (saveMode)
{
hr = CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
}
else
{
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
}
if (SUCCEEDED(hr))
{
// Set the options for the dialog.
DWORD dwFlags;
hr = pfd->GetOptions(&dwFlags);
if (SUCCEEDED(hr))
{
dwFlags |= FOS_NOCHANGEDIR | FOS_FILEMUSTEXIST | FOS_PATHMUSTEXIST | FOS_FORCEFILESYSTEM | FOS_NOVALIDATE;
if (!keepHistory)
dwFlags |= FOS_DONTADDTORECENT;
if (saveMode)
dwFlags |= FOS_NOTESTFILECREATE | FOS_OVERWRITEPROMPT | FOS_DEFAULTNOMINIMODE;
hr = pfd->SetOptions(dwFlags);
}
// Set the initial directory, if provided.
if (initialDir) if (initialDir)
{ {
ofn.lpstrInitialDir = initialDir; IShellItem *psi;
hr = SHCreateItemFromParsingName(initialDir, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
pfd->SetFolder(psi);
psi->Release();
}
} }
// Set the initial file name, if provided.
if (initialFileName) if (initialFileName)
StringCchCopyW (file, array_capacity (file), initialFileName); {
pfd->SetFileName(initialFileName);
}
ofn.lStructSize = sizeof (ofn); // Set the title.
ofn.hwndOwner = hwndDlg; pfd->SetTitle(GetString(stringId));
// Set the default extension.
if (defaultExtension)
{
pfd->SetDefaultExtension(defaultExtension);
}
// Prepare the filter
COMDLG_FILTERSPEC filterSpec[5];
UINT cfilterSpec = 0;
if (!browseFilter)
{
StringCbPrintfW(filter, sizeof(filter), L"%ls (*.*)%c*.*%c%ls (*.hc)%c*.hc%c%c", StringCbPrintfW(filter, sizeof(filter), L"%ls (*.*)%c*.*%c%ls (*.hc)%c*.hc%c%c",
GetString("ALL_FILES"), 0, 0, GetString("TC_VOLUMES"), 0, 0, 0); GetString("ALL_FILES"), 0, 0, GetString("TC_VOLUMES"), 0, 0, 0);
ofn.lpstrFilter = browseFilter ? browseFilter : filter; browseFilter = filter;
ofn.nFilterIndex = 1; }
ofn.lpstrFile = file;
ofn.nMaxFile = sizeof (file) / sizeof (file[0]); // Assume browseFilter is a formatted wide string like L"Text Files (*.txt)\0*.txt\0"
ofn.lpstrTitle = GetString (stringId); // loop over all the filters in the string and add them to filterSpec array
ofn.lpstrDefExt = defaultExtension; while (*browseFilter)
ofn.Flags = OFN_HIDEREADONLY {
| OFN_PATHMUSTEXIST filterSpec[cfilterSpec].pszName = browseFilter;
| (keepHistory ? 0 : OFN_DONTADDTORECENT) browseFilter += wcslen(browseFilter) + 1;
| (saveMode ? OFN_OVERWRITEPROMPT : 0); filterSpec[cfilterSpec].pszSpec = browseFilter;
browseFilter += wcslen(browseFilter) + 1;
cfilterSpec++;
if (cfilterSpec >= ARRAYSIZE(filterSpec))
break;
}
// Set the file types filter.
hr = pfd->SetFileTypes(cfilterSpec, filterSpec);
hr = pfd->SetFileTypeIndex(1);
if (!keepHistory) if (!keepHistory)
CleanLastVisitedMRU(); CleanLastVisitedMRU();
@@ -5012,27 +5069,34 @@ BOOL BrowseFilesInDir (HWND hwndDlg, char *stringId, wchar_t *initialDir, wchar_
SystemFileSelectorCallerThreadId = GetCurrentThreadId(); SystemFileSelectorCallerThreadId = GetCurrentThreadId();
SystemFileSelectorCallPending = TRUE; SystemFileSelectorCallPending = TRUE;
if (!saveMode) // Show the dialog.
hr = pfd->Show(hwndDlg);
// Obtain the result if the user clicked the "OK" button.
if (SUCCEEDED(hr))
{ {
if (!GetOpenFileNameW (&ofn)) IShellItem *pItem;
goto ret; hr = pfd->GetResult(&pItem);
if (SUCCEEDED(hr))
{
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
StringCchCopyW(lpszFileName, MAX_PATH, pszFilePath);
CoTaskMemFree(pszFilePath);
status = TRUE;
}
pItem->Release();
} }
else
{
if (!GetSaveFileNameW (&ofn))
goto ret;
} }
SystemFileSelectorCallPending = FALSE; pfd->Release();
StringCchCopyW (lpszFileName, MAX_PATH, file);
if (!keepHistory) if (!keepHistory)
CleanLastVisitedMRU(); CleanLastVisitedMRU();
}
status = TRUE;
ret:
SystemFileSelectorCallPending = FALSE; SystemFileSelectorCallPending = FALSE;
ResetCurrentDirectory(); ResetCurrentDirectory();
CoUninitialize(); CoUninitialize();
@@ -5040,170 +5104,173 @@ ret:
return status; return status;
} }
BOOL SelectMultipleFiles(HWND hwndDlg, const char *stringId, BOOL keepHistory, std::vector<std::wstring> &filesList)
static wchar_t SelectMultipleFilesPath[131072];
static int SelectMultipleFilesOffset;
BOOL SelectMultipleFiles (HWND hwndDlg, const char *stringId, wchar_t *lpszFileName, size_t cbFileName,BOOL keepHistory)
{ {
OPENFILENAMEW ofn; IFileOpenDialog *pfd = NULL;
wchar_t filter[1024]; HRESULT hr;
BOOL status = FALSE; BOOL status = FALSE;
CoInitialize (NULL); filesList.clear();
ZeroMemory (&ofn, sizeof (ofn)); hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr))
{
return FALSE;
}
SelectMultipleFilesPath[0] = 0; // Create the File Open Dialog object.
*lpszFileName = 0; hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
ofn.lStructSize = sizeof (ofn); if (SUCCEEDED(hr))
ofn.hwndOwner = hwndDlg; {
StringCbPrintfW (filter, sizeof(filter), L"%ls (*.*)%c*.*%c%ls (*.hc)%c*.hc%c%c", DWORD dwFlags;
GetString ("ALL_FILES"), 0, 0, GetString ("TC_VOLUMES"), 0, 0, 0); hr = pfd->GetOptions(&dwFlags);
ofn.lpstrFilter = filter; if (SUCCEEDED(hr))
ofn.nFilterIndex = 1; {
ofn.lpstrFile = SelectMultipleFilesPath; dwFlags |= FOS_ALLOWMULTISELECT | FOS_NOCHANGEDIR | FOS_FILEMUSTEXIST | FOS_PATHMUSTEXIST | FOS_FORCEFILESYSTEM | FOS_NOVALIDATE;
ofn.nMaxFile = 0xffff * 2; // The size must not exceed 0xffff*2 due to a bug in Windows 2000 and XP SP1 if (!keepHistory)
ofn.lpstrTitle = GetString (stringId); dwFlags |= FOS_DONTADDTORECENT;
ofn.Flags = OFN_HIDEREADONLY
| OFN_EXPLORER hr = pfd->SetOptions(dwFlags);
| OFN_PATHMUSTEXIST }
| OFN_ALLOWMULTISELECT
| (keepHistory ? 0 : OFN_DONTADDTORECENT); // Set the title and filter
pfd->SetTitle(GetString(stringId));
wchar_t allFilesfilter[512];
wchar_t volumesfilter[512];
StringCbPrintfW(allFilesfilter, sizeof(allFilesfilter), L"%ls (*.*)", GetString("ALL_FILES"));
StringCbPrintfW(volumesfilter, sizeof(volumesfilter), L"%ls (*.hc)", GetString("TC_VOLUMES"));
COMDLG_FILTERSPEC rgSpec[] =
{
{allFilesfilter, L"*.*"},
{volumesfilter, L"*.hc"}};
hr = pfd->SetFileTypes(ARRAYSIZE(rgSpec), rgSpec);
if (!keepHistory) if (!keepHistory)
CleanLastVisitedMRU(); CleanLastVisitedMRU();
SystemFileSelectorCallerThreadId = GetCurrentThreadId(); // Show the dialog
SystemFileSelectorCallPending = TRUE; hr = pfd->Show(hwndDlg);
if (SUCCEEDED(hr))
if (!GetOpenFileNameW (&ofn))
goto ret;
SystemFileSelectorCallPending = FALSE;
if (SelectMultipleFilesPath[ofn.nFileOffset - 1] != 0)
{ {
// Single file selected IShellItemArray *psiaResults;
StringCbCopyW (lpszFileName, cbFileName, SelectMultipleFilesPath); hr = pfd->GetResults(&psiaResults);
SelectMultipleFilesOffset = 0; if (SUCCEEDED(hr))
SecureZeroMemory (SelectMultipleFilesPath, sizeof (SelectMultipleFilesPath));
}
else
{ {
// Multiple files selected DWORD count;
SelectMultipleFilesOffset = ofn.nFileOffset; hr = psiaResults->GetCount(&count);
SelectMultipleFilesNext (lpszFileName, cbFileName); if (SUCCEEDED(hr))
{
for (DWORD i = 0; i < count; ++i)
{
IShellItem *psi;
hr = psiaResults->GetItemAt(i, &psi);
if (SUCCEEDED(hr))
{
PWSTR pszFilePath;
hr = psi->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
filesList.push_back(pszFilePath);
CoTaskMemFree(pszFilePath);
}
psi->Release();
}
} }
if (!keepHistory)
CleanLastVisitedMRU ();
status = TRUE; status = TRUE;
}
psiaResults->Release();
}
}
if (!keepHistory)
CleanLastVisitedMRU();
pfd->Release();
}
ret:
SystemFileSelectorCallPending = FALSE;
ResetCurrentDirectory();
CoUninitialize(); CoUninitialize();
return status; return status;
} }
BOOL BrowseDirectories(HWND hwndDlg, char *lpszTitle, wchar_t *dirName, const wchar_t *initialDir)
BOOL SelectMultipleFilesNext (wchar_t *lpszFileName, size_t cbFileName)
{ {
if (SelectMultipleFilesOffset == 0) IFileDialog *pfd = NULL;
return FALSE; HRESULT hr;
StringCbCopyW (lpszFileName, cbFileName,SelectMultipleFilesPath);
lpszFileName[TC_MAX_PATH - 1] = 0;
if (lpszFileName[wcslen (lpszFileName) - 1] != L'\\')
StringCbCatW (lpszFileName, cbFileName,L"\\");
StringCbCatW (lpszFileName, cbFileName,SelectMultipleFilesPath + SelectMultipleFilesOffset);
SelectMultipleFilesOffset += (int) wcslen (SelectMultipleFilesPath + SelectMultipleFilesOffset) + 1;
if (SelectMultipleFilesPath[SelectMultipleFilesOffset] == 0)
{
SelectMultipleFilesOffset = 0;
SecureZeroMemory (SelectMultipleFilesPath, sizeof (SelectMultipleFilesPath));
}
return TRUE;
}
static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData)
{
switch(uMsg) {
case BFFM_INITIALIZED:
{
/* WParam is TRUE since we are passing a path.
It would be FALSE if we were passing a pidl. */
SendMessageW (hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)pData);
break;
}
case BFFM_SELCHANGED:
{
wchar_t szDir[TC_MAX_PATH];
/* Set the status window to the currently selected path. */
if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir))
{
SendMessage (hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
}
default:
break;
}
return 0;
}
BOOL BrowseDirectories (HWND hwndDlg, char *lpszTitle, wchar_t *dirName)
{
BROWSEINFOW bi;
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
BOOL bOK = FALSE; BOOL bOK = FALSE;
CoInitialize (NULL); hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr))
{
return FALSE;
}
if (SUCCEEDED (SHGetMalloc (&pMalloc))) hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{ {
ZeroMemory (&bi, sizeof(bi)); // Set the options on the dialog.
bi.hwndOwner = hwndDlg; DWORD dwFlags;
bi.pszDisplayName = 0; hr = pfd->GetOptions(&dwFlags);
bi.lpszTitle = GetString (lpszTitle); if (SUCCEEDED(hr))
bi.pidlRoot = 0; {
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; dwFlags |= FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_NOCHANGEDIR; // Important to enable folder-picking mode
bi.lpfn = BrowseCallbackProc; hr = pfd->SetOptions(dwFlags);
bi.lParam = (LPARAM)dirName; }
pidl = SHBrowseForFolderW (&bi); // Set the title.
if (pidl != NULL) if (lpszTitle)
{ {
if (SHGetPathFromIDList(pidl, dirName)) pfd->SetTitle(GetString(lpszTitle));
}
IShellItem *psi;
if (initialDir)
{ {
// Set the initial directory, if provided.
hr = SHCreateItemFromParsingName(initialDir, NULL, IID_PPV_ARGS(&psi));
}
else
{
// set folder to "This PC" shel item
hr = SHCreateItemInKnownFolder(FOLDERID_ComputerFolder, 0, NULL, IID_PPV_ARGS(&psi));
}
if (SUCCEEDED(hr))
{
pfd->SetFolder(psi);
psi->Release();
}
// Show the dialog.
hr = pfd->Show(hwndDlg);
if (SUCCEEDED(hr))
{
// Obtain the result when the user clicks the "OK" button.
// The result is an IShellItem object.
IShellItem *pItem;
hr = pfd->GetResult(&pItem);
if (SUCCEEDED(hr))
{
PWSTR pszFolderPath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFolderPath);
if (SUCCEEDED(hr))
{
StringCchCopyW(dirName, MAX_PATH, pszFolderPath);
CoTaskMemFree(pszFolderPath);
bOK = TRUE; bOK = TRUE;
} }
pItem->Release();
pMalloc->Free (pidl);
pMalloc->Release();
} }
} }
pfd->Release();
}
CoUninitialize(); CoUninitialize();
return bOK; return bOK;
} }
std::wstring GetWrongPasswordErrorMessage (HWND hwndDlg) std::wstring GetWrongPasswordErrorMessage (HWND hwndDlg)
{ {
WCHAR szTmp[8192]; WCHAR szTmp[8192];
@@ -6891,7 +6958,7 @@ BOOL CALLBACK KeyfileGeneratorDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LP
fileExtensionPtr = wcsrchr(szFileBaseName, L'.'); fileExtensionPtr = wcsrchr(szFileBaseName, L'.');
/* Select directory */ /* Select directory */
if (!BrowseDirectories (hwndDlg, "SELECT_KEYFILE_GENERATION_DIRECTORY", szDirName)) if (!BrowseDirectories (hwndDlg, "SELECT_KEYFILE_GENERATION_DIRECTORY", szDirName, NULL))
return 1; return 1;
if (szDirName[wcslen(szDirName) - 1] != L'\\' && szDirName[wcslen(szDirName) - 1] != L'/') if (szDirName[wcslen(szDirName) - 1] != L'\\' && szDirName[wcslen(szDirName) - 1] != L'/')
@@ -11899,7 +11966,7 @@ BOOL CALLBACK SecurityTokenKeyfileDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam
{ {
wchar_t keyfilePath[TC_MAX_PATH]; wchar_t keyfilePath[TC_MAX_PATH];
if (BrowseFiles (hwndDlg, "SELECT_KEYFILE", keyfilePath, bHistory, FALSE, NULL)) if (BrowseFiles (hwndDlg, "SELECT_KEYFILE", keyfilePath, bHistory, FALSE))
{ {
DWORD keyfileSize; DWORD keyfileSize;
byte *keyfileData = (byte *) LoadFile (keyfilePath, &keyfileSize); byte *keyfileData = (byte *) LoadFile (keyfilePath, &keyfileSize);
@@ -11962,7 +12029,7 @@ BOOL CALLBACK SecurityTokenKeyfileDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam
{ {
wchar_t keyfilePath[TC_MAX_PATH]; wchar_t keyfilePath[TC_MAX_PATH];
if (!BrowseFiles (hwndDlg, "OPEN_TITLE", keyfilePath, bHistory, TRUE, NULL)) if (!BrowseFiles (hwndDlg, "OPEN_TITLE", keyfilePath, bHistory, TRUE))
break; break;
{ {

View File

@@ -376,8 +376,8 @@ int DriverAttach ( void );
BOOL CALLBACK CipherTestDialogProc ( HWND hwndDlg , UINT uMsg , WPARAM wParam , LPARAM lParam ); BOOL CALLBACK CipherTestDialogProc ( HWND hwndDlg , UINT uMsg , WPARAM wParam , LPARAM lParam );
void ResetCipherTest ( HWND hwndDlg , int idTestCipher ); void ResetCipherTest ( HWND hwndDlg , int idTestCipher );
void ResetCurrentDirectory (); void ResetCurrentDirectory ();
BOOL BrowseFiles (HWND hwndDlg, char *stringId, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter); BOOL BrowseFiles (HWND hwndDlg, char *stringId, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode);
BOOL BrowseDirectories (HWND hWnd, char *lpszTitle, wchar_t *dirName); BOOL BrowseDirectories(HWND hwndDlg, char *lpszTitle, wchar_t *dirName, const wchar_t *initialDir);
void handleError ( HWND hwndDlg , int code, const char* srcPos ); void handleError ( HWND hwndDlg , int code, const char* srcPos );
BOOL CheckFileStreamWriteErrors (HWND hwndDlg, FILE *file, const wchar_t *fileName); BOOL CheckFileStreamWriteErrors (HWND hwndDlg, FILE *file, const wchar_t *fileName);
void LocalizeDialog ( HWND hwnd, char *stringId ); void LocalizeDialog ( HWND hwnd, char *stringId );
@@ -512,8 +512,6 @@ BOOL CALLBACK FindTCWindowEnum (HWND hwnd, LPARAM lParam);
BYTE *MapResource (wchar_t *resourceType, int resourceId, PDWORD size); BYTE *MapResource (wchar_t *resourceType, int resourceId, PDWORD size);
void InconsistencyResolved (char *msg); void InconsistencyResolved (char *msg);
void ReportUnexpectedState (const char *techInfo); void ReportUnexpectedState (const char *techInfo);
BOOL SelectMultipleFiles (HWND hwndDlg, const char *stringId, wchar_t *lpszFileName, size_t cbFileName, BOOL keepHistory);
BOOL SelectMultipleFilesNext (wchar_t *lpszFileName, size_t cbFileName);
void OpenOnlineHelp (); void OpenOnlineHelp ();
BOOL GetPartitionInfo (const wchar_t *deviceName, PPARTITION_INFORMATION rpartInfo); BOOL GetPartitionInfo (const wchar_t *deviceName, PPARTITION_INFORMATION rpartInfo);
BOOL GetDeviceInfo (const wchar_t *deviceName, DISK_PARTITION_INFO_STRUCT *info); BOOL GetDeviceInfo (const wchar_t *deviceName, DISK_PARTITION_INFO_STRUCT *info);
@@ -692,6 +690,7 @@ struct RawDevicesDlgParam
wchar_t *pszFileName; wchar_t *pszFileName;
}; };
BOOL SelectMultipleFiles (HWND hwndDlg, const char *stringId, BOOL keepHistory, std::vector<std::wstring>& filesList);
BOOL BrowseFilesInDir (HWND hwndDlg, char *stringId, wchar_t *initialDir, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter, const wchar_t *initialFileName = NULL, const wchar_t *defaultExtension = NULL); BOOL BrowseFilesInDir (HWND hwndDlg, char *stringId, wchar_t *initialDir, wchar_t *lpszFileName, BOOL keepHistory, BOOL saveMode, wchar_t *browseFilter, const wchar_t *initialFileName = NULL, const wchar_t *defaultExtension = NULL);
std::wstring SingleStringToWide (const std::string &singleString); std::wstring SingleStringToWide (const std::string &singleString);
std::wstring Utf8StringToWide (const std::string &utf8String); std::wstring Utf8StringToWide (const std::string &utf8String);

View File

@@ -494,11 +494,15 @@ BOOL CALLBACK KeyFilesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa
KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile)); KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile));
if (kf) if (kf)
{ {
if (SelectMultipleFiles (hwndDlg, "SELECT_KEYFILE", kf->FileName, sizeof(kf->FileName),bHistory)) std::vector<std::wstring> filesList;
if (SelectMultipleFiles (hwndDlg, "SELECT_KEYFILE", bHistory, filesList))
{ {
bool containerFileSkipped = false; bool containerFileSkipped = false;
do for (std::vector<std::wstring>::const_iterator it = filesList.begin();
it != filesList.end();
++it)
{ {
StringCbCopyW (kf->FileName, sizeof (kf->FileName), it->c_str());
CorrectFileName (kf->FileName); CorrectFileName (kf->FileName);
if (_wcsicmp (param->VolumeFileName, kf->FileName) == 0) if (_wcsicmp (param->VolumeFileName, kf->FileName) == 0)
containerFileSkipped = true; containerFileSkipped = true;
@@ -514,7 +518,7 @@ BOOL CALLBACK KeyFilesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa
break; break;
} }
} }
} while (SelectMultipleFilesNext (kf->FileName, sizeof(kf->FileName))); }
if (containerFileSkipped) if (containerFileSkipped)
{ {
@@ -533,7 +537,7 @@ BOOL CALLBACK KeyFilesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa
KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile)); KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile));
if (kf) if (kf)
{ {
if (BrowseDirectories (hwndDlg,"SELECT_KEYFILE_PATH", kf->FileName)) if (BrowseDirectories (hwndDlg,"SELECT_KEYFILE_PATH", kf->FileName, NULL))
{ {
param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf); param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf);
LoadKeyList (hwndDlg, param->FirstKeyFile); LoadKeyList (hwndDlg, param->FirstKeyFile);
@@ -711,10 +715,14 @@ BOOL KeyfilesPopupMenu (HWND hwndDlg, POINT popupPosition, KeyFilesDlgParam *par
KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile)); KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile));
if (kf) if (kf)
{ {
if (SelectMultipleFiles (hwndDlg, "SELECT_KEYFILE", kf->FileName, sizeof(kf->FileName),bHistory)) std::vector<std::wstring> filesList;
if (SelectMultipleFiles (hwndDlg, "SELECT_KEYFILE", bHistory, filesList))
{ {
do for (std::vector<std::wstring>::const_iterator it = filesList.begin();
it != filesList.end();
++it)
{ {
StringCbCopyW (kf->FileName, sizeof (kf->FileName), it->c_str());
param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf); param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf);
kf = (KeyFile *) malloc (sizeof (KeyFile)); kf = (KeyFile *) malloc (sizeof (KeyFile));
if (!kf) if (!kf)
@@ -722,7 +730,7 @@ BOOL KeyfilesPopupMenu (HWND hwndDlg, POINT popupPosition, KeyFilesDlgParam *par
Warning ("ERR_MEM_ALLOC", hwndDlg); Warning ("ERR_MEM_ALLOC", hwndDlg);
break; break;
} }
} while (SelectMultipleFilesNext (kf->FileName, sizeof(kf->FileName))); }
param->EnableKeyFiles = TRUE; param->EnableKeyFiles = TRUE;
status = TRUE; status = TRUE;
@@ -739,7 +747,7 @@ BOOL KeyfilesPopupMenu (HWND hwndDlg, POINT popupPosition, KeyFilesDlgParam *par
KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile)); KeyFile *kf = (KeyFile *) malloc (sizeof (KeyFile));
if (kf) if (kf)
{ {
if (BrowseDirectories (hwndDlg,"SELECT_KEYFILE_PATH", kf->FileName)) if (BrowseDirectories (hwndDlg,"SELECT_KEYFILE_PATH", kf->FileName, NULL))
{ {
param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf); param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf);
param->EnableKeyFiles = TRUE; param->EnableKeyFiles = TRUE;

View File

@@ -836,7 +836,7 @@ int ExtcvAskVolumePassword (HWND hwndDlg, const wchar_t* fileName, Password *pas
static BOOL SelectContainer (HWND hwndDlg) static BOOL SelectContainer (HWND hwndDlg)
{ {
if (BrowseFiles (hwndDlg, "OPEN_VOL_TITLE", szFileName, bHistory, FALSE, NULL) == FALSE) if (BrowseFiles (hwndDlg, "OPEN_VOL_TITLE", szFileName, bHistory, FALSE) == FALSE)
return FALSE; return FALSE;
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory); AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);

View File

@@ -5903,7 +5903,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
{ {
// Select file // Select file
if (BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, !bHiddenVolDirect, NULL) == FALSE) if (BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, !bHiddenVolDirect) == FALSE)
return 1; return 1;
AddComboItem (GetDlgItem (hwndDlg, IDC_COMBO_BOX), szFileName, bHistory); AddComboItem (GetDlgItem (hwndDlg, IDC_COMBO_BOX), szFileName, bHistory);
@@ -6094,7 +6094,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
{ {
wchar_t tmpszRescueDiskISO [TC_MAX_PATH+1]; wchar_t tmpszRescueDiskISO [TC_MAX_PATH+1];
if (!BrowseFiles (hwndDlg, "OPEN_TITLE", tmpszRescueDiskISO, FALSE, TRUE, NULL)) if (!BrowseFiles (hwndDlg, "OPEN_TITLE", tmpszRescueDiskISO, FALSE, TRUE))
return 1; return 1;
StringCbCopyW (szRescueDiskISO, sizeof(szRescueDiskISO), tmpszRescueDiskISO); StringCbCopyW (szRescueDiskISO, sizeof(szRescueDiskISO), tmpszRescueDiskISO);

View File

@@ -4514,7 +4514,7 @@ BOOL CALLBACK TravelerDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa
wchar_t dstPath[MAX_PATH * 2]; wchar_t dstPath[MAX_PATH * 2];
GetDlgItemText (hwndDlg, IDC_DIRECTORY, dstPath, ARRAYSIZE (dstPath)); GetDlgItemText (hwndDlg, IDC_DIRECTORY, dstPath, ARRAYSIZE (dstPath));
if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", dstPath)) if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", dstPath, dstPath))
SetDlgItemText (hwndDlg, IDC_DIRECTORY, dstPath); SetDlgItemText (hwndDlg, IDC_DIRECTORY, dstPath);
return 1; return 1;
@@ -6567,7 +6567,7 @@ static void ResumeInterruptedNonSysInplaceEncProcess (BOOL bDecrypt)
BOOL SelectContainer (HWND hwndDlg) BOOL SelectContainer (HWND hwndDlg)
{ {
if (BrowseFiles (hwndDlg, "OPEN_VOL_TITLE", szFileName, bHistory, FALSE, NULL) == FALSE) if (BrowseFiles (hwndDlg, "OPEN_VOL_TITLE", szFileName, bHistory, FALSE) == FALSE)
return FALSE; return FALSE;
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory); AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
@@ -10957,7 +10957,7 @@ noHidden:
goto ret; goto ret;
/* Select backup file */ /* Select backup file */
if (!BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, TRUE, NULL)) if (!BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, TRUE))
goto ret; goto ret;
/* Conceive the backup file */ /* Conceive the backup file */
@@ -11240,7 +11240,7 @@ int RestoreVolumeHeader (HWND hwndDlg, const wchar_t *lpszVolume)
} }
/* Select backup file */ /* Select backup file */
if (!BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, FALSE, NULL)) if (!BrowseFiles (hwndDlg, "OPEN_TITLE", szFileName, bHistory, FALSE))
{ {
nStatus = ERR_SUCCESS; nStatus = ERR_SUCCESS;
goto ret; goto ret;

View File

@@ -45,8 +45,8 @@ enum wizard_pages
HWND hCurPage = NULL; /* Handle to current wizard page */ HWND hCurPage = NULL; /* Handle to current wizard page */
int nCurPageNo = -1; /* The current wizard page */ int nCurPageNo = -1; /* The current wizard page */
wchar_t WizardDestInstallPath [TC_MAX_PATH]; wchar_t WizardDestInstallPath [TC_MAX_PATH] = { 0 };
wchar_t WizardDestExtractPath [TC_MAX_PATH]; wchar_t WizardDestExtractPath [TC_MAX_PATH] = { 0 };
wchar_t SelfFile [TC_MAX_PATH]; wchar_t SelfFile [TC_MAX_PATH];
HBITMAP hbmWizardBitmapRescaled = NULL; HBITMAP hbmWizardBitmapRescaled = NULL;
@@ -646,7 +646,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
switch (lw) switch (lw)
{ {
case IDC_BROWSE: case IDC_BROWSE:
if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", WizardDestExtractPath)) if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", WizardDestExtractPath, WizardDestExtractPath))
{ {
if (WizardDestExtractPath [wcslen(WizardDestExtractPath)-1] != L'\\') if (WizardDestExtractPath [wcslen(WizardDestExtractPath)-1] != L'\\')
{ {
@@ -667,7 +667,7 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
switch (lw) switch (lw)
{ {
case IDC_BROWSE: case IDC_BROWSE:
if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", WizardDestInstallPath)) if (BrowseDirectories (hwndDlg, "SELECT_DEST_DIR", WizardDestInstallPath, WizardDestInstallPath))
{ {
if (WizardDestInstallPath [wcslen(WizardDestInstallPath)-1] != L'\\') if (WizardDestInstallPath [wcslen(WizardDestInstallPath)-1] != L'\\')
{ {