Skip to content

Commit fad5137

Browse files
authored
Merge ebdf3a3 into 7566280
2 parents 7566280 + ebdf3a3 commit fad5137

3 files changed

Lines changed: 57 additions & 6 deletions

File tree

Src/Lib/Settings.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
16701670
ofn.lpstrTitle=title;
16711671
ofn.lpstrDefExt=L".xml";
16721672
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
1673-
if (GetSaveFileName(&ofn))
1673+
if (GetSaveFileNameSafe(&ofn))
16741674
{
16751675
CString err=g_SettingsManager.SaveSettingsXml(path);
16761676
if (!err.IsEmpty())
@@ -1699,7 +1699,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
16991699
CString title=LoadStringEx(IDS_XML_TITLE_LOAD);
17001700
ofn.lpstrTitle=title;
17011701
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
1702-
if (GetOpenFileName(&ofn))
1702+
if (GetOpenFileNameSafe(&ofn))
17031703
{
17041704
SetCurTab(m_Index,true); // reload tab once to force-close any active edit boxes
17051705
CString error=g_SettingsManager.LoadSettingsXml(path);

Src/Lib/SettingsUIHelper.cpp

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <uxtheme.h>
1616
#include <map>
1717
#include <algorithm>
18+
#include <thread>
1819

1920
const KNOWNFOLDERID FOLDERID_DesktopRoot={'DESK', 'TO', 'P', {'D', 'E', 'S', 'K', 'T', 'O', 'P', 0x00}};
2021

@@ -1193,7 +1194,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text )
11931194
ofn.lpstrFile=text;
11941195
ofn.nMaxFile=_MAX_PATH;
11951196
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NODEREFERENCELINKS;
1196-
if (GetOpenFileName(&ofn))
1197+
if (GetOpenFileNameSafe(&ofn))
11971198
{
11981199
wchar_t buf[_MAX_PATH];
11991200
UnExpandEnvStrings(text,buf,_countof(buf));
@@ -2011,7 +2012,7 @@ LRESULT CBrowseForIconDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, B
20112012
CString title=LoadStringEx(IDS_ICON_TITLE);
20122013
ofn.lpstrTitle=title;
20132014
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
2014-
if (GetOpenFileName(&ofn))
2015+
if (GetOpenFileNameSafe(&ofn))
20152016
{
20162017
wchar_t buf[_MAX_PATH];
20172018
UnExpandEnvStrings(path,buf,_countof(buf));
@@ -2210,7 +2211,7 @@ bool BrowseForBitmap( HWND hWndParent, wchar_t *path, bool bAllowJpeg )
22102211
CString title=LoadStringEx(IDS_BMP_TITLE);
22112212
ofn.lpstrTitle=title;
22122213
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
2213-
if (GetOpenFileName(&ofn))
2214+
if (GetOpenFileNameSafe(&ofn))
22142215
{
22152216
wchar_t buf[_MAX_PATH];
22162217
UnExpandEnvStrings(path,buf,_countof(buf));
@@ -2242,7 +2243,7 @@ bool BrowseForSound( HWND hWndParent, wchar_t *path )
22422243
CString title=LoadStringEx(IDS_WAV_TITLE);
22432244
ofn.lpstrTitle=title;
22442245
ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
2245-
if (GetOpenFileName(&ofn))
2246+
if (GetOpenFileNameSafe(&ofn))
22462247
{
22472248
wchar_t buf[_MAX_PATH];
22482249
UnExpandEnvStrings(path,buf,_countof(buf));
@@ -3630,3 +3631,49 @@ DWORD ParseColor(const wchar_t* str)
36303631
wchar_t* end;
36313632
return wcstoul(str, &end, 16) & 0xFFFFFF;
36323633
}
3634+
3635+
// Run GetOpenFileName/GetSaveFileName on a separate STA thread and pump messages on the caller
3636+
template <typename auto Fnc>
3637+
static BOOL GetFileNameSafe(OPENFILENAME* pOfn)
3638+
{
3639+
BOOL result = FALSE;
3640+
3641+
std::thread worker([&pOfn, &result]() mutable {
3642+
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
3643+
result = Fnc(pOfn);
3644+
CoUninitialize();
3645+
});
3646+
3647+
// Pump messages while waiting for the worker (dialog) to finish
3648+
while (true)
3649+
{
3650+
HANDLE hWorker = worker.native_handle();
3651+
if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0)
3652+
break;
3653+
3654+
MSG msg;
3655+
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
3656+
{
3657+
if (msg.message == WM_QUIT)
3658+
{
3659+
PostQuitMessage((int)msg.wParam);
3660+
break;
3661+
}
3662+
TranslateMessage(&msg);
3663+
DispatchMessage(&msg);
3664+
}
3665+
}
3666+
worker.join();
3667+
3668+
return result;
3669+
}
3670+
3671+
BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn)
3672+
{
3673+
return GetFileNameSafe<GetOpenFileNameW>(pOfn);
3674+
}
3675+
3676+
BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn)
3677+
{
3678+
return GetFileNameSafe<GetSaveFileNameW>(pOfn);
3679+
}

Src/Lib/SettingsUIHelper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,3 +395,7 @@ DWORD BgrToRgb(DWORD val);
395395

396396
// parse color from hexadecimal string
397397
DWORD ParseColor(const wchar_t* str);
398+
399+
// safe versions of GetOpenFileName/GetSaveFileName (run API on a separate STA thread and pump messages on the caller)
400+
BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn);
401+
BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn);

0 commit comments

Comments
 (0)