diff options
Diffstat (limited to 'ui/IFileDialog_Vista/ifile_dialog.cpp')
-rw-r--r-- | ui/IFileDialog_Vista/ifile_dialog.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/ui/IFileDialog_Vista/ifile_dialog.cpp b/ui/IFileDialog_Vista/ifile_dialog.cpp index 8c3e694c..565dfa1a 100644 --- a/ui/IFileDialog_Vista/ifile_dialog.cpp +++ b/ui/IFileDialog_Vista/ifile_dialog.cpp @@ -19,6 +19,7 @@ namespace { bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if cancelled by user const wchar_t* defaultFolder, //optional! + const GUID* persistenceGuid, // std::wstring& selectedFolder) { ComPtr<IFileDialog> fileDlg; @@ -27,6 +28,9 @@ bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if CLSCTX_ALL, IID_PPV_ARGS(fileDlg.init()))); + if (persistenceGuid) + ZEN_CHECK_COM(fileDlg->SetClientGuid(*persistenceGuid)); + FILEOPENDIALOGOPTIONS dlgOptions = 0; ZEN_CHECK_COM(fileDlg->GetOptions(&dlgOptions)); //throw ComError ZEN_CHECK_COM(fileDlg->SetOptions(dlgOptions | FOS_PICKFOLDERS | FOS_NOVALIDATE | FOS_FORCEFILESYSTEM)); @@ -57,7 +61,7 @@ bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if return true; } -const wchar_t* allocString(const std::wstring& msg) //ownership passed +wchar_t* allocString(const std::wstring& msg) //ownership passed { auto tmp = new wchar_t [msg.size() + 1]; //std::bad_alloc ? ::wmemcpy(tmp, msg.c_str(), msg.size() + 1); //include 0-termination @@ -69,9 +73,10 @@ const wchar_t* allocString(const std::wstring& msg) //ownership passed void ifile::showFolderPicker(void* ownerWindow, const wchar_t* defaultFolder, - const wchar_t*& selectedFolder, + const GuidProxy* guid, + wchar_t*& selectedFolder, bool& cancelled, - const wchar_t*& errorMsg) + wchar_t*& errorMsg) { selectedFolder = nullptr; cancelled = false; @@ -79,8 +84,13 @@ void ifile::showFolderPicker(void* ownerWindow, try { + static_assert(sizeof(GuidProxy) == sizeof(GUID), ""); + GUID winGuid = {}; + if (guid) + ::memcpy(&winGuid, guid, sizeof(GUID)); + std::wstring folderPath; - if (showFolderPickerImpl(static_cast<HWND>(ownerWindow), defaultFolder, folderPath)) //throw ComError + if (showFolderPickerImpl(static_cast<HWND>(ownerWindow), defaultFolder, guid ? &winGuid : nullptr, folderPath)) //throw ComError selectedFolder = allocString(folderPath); else cancelled = true; |