fix bug that shobjidl.h isn't supported well on MinGW

This commit is contained in:
Jinhao 2018-06-27 02:45:39 +08:00
parent 3075eccacf
commit a120447716
2 changed files with 66 additions and 22 deletions

View File

@ -16,6 +16,7 @@
#define NANA_GUI_FILEBOX_HPP
#include <nana/gui/basis.hpp>
#include <nana/filesystem/filesystem.hpp>
#include <nana/optional.hpp>
#include <vector>
#include <utility>

View File

@ -16,7 +16,11 @@
#if defined(NANA_WINDOWS)
# include <windows.h>
# ifndef NANA_MINGW //<Shobjidl.h> isn't supported well on MinGW
# include <Shobjidl.h>
# else
# include <Shlobj.h>
# endif
#elif defined(NANA_POSIX)
# include <nana/gui/widgets/label.hpp>
# include <nana/gui/widgets/button.hpp>
@ -1221,12 +1225,30 @@ namespace nana
delete impl_;
}
#ifdef NANA_MINGW
static int CALLBACK browse_folder_callback(HWND hwnd, UINT msg, LPARAM lparam, LPARAM data)
{
// If the BFFM_INITIALIZED message is received
// set the path to the start path.
switch (msg)
{
case BFFM_INITIALIZED:
if (data)
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, data);
break;
}
return 0; // The function should always return 0.
}
#endif
std::optional<folderbox::path_type> folderbox::show() const
{
#ifdef NANA_WINDOWS
std::optional<folderbox::path_type> target;
CoInitialize(NULL);
::CoInitialize(nullptr);
#ifndef NANA_MINGW
IFileDialog *fd(nullptr);
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&fd));
if (SUCCEEDED(hr))
@ -1254,7 +1276,28 @@ namespace nana
}
fd->Release();
}
CoUninitialize();
#else
BROWSEINFO brw = { 0 };
wchar_t display_text[MAX_PATH];
brw.hwndOwner = reinterpret_cast<HWND>(API::root(impl_->owner));
brw.pszDisplayName = display_text;
brw.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
brw.lpfn = browse_folder_callback;
std::wstring init_path = impl_->init_path.wstring();
brw.lParam = reinterpret_cast<LPARAM>(init_path.c_str());
auto pidl = ::SHBrowseForFolder(&brw);
if (pidl)
{
wchar_t folder_path[MAX_PATH];
if (FALSE != SHGetPathFromIDList(pidl, folder_path))
target = folder_path;
CoTaskMemFree(pidl);
}
#endif
::CoUninitialize();
return target;