void OnFileOpen(HWND hwnd) { HRESULT hr = S_OK; IFileDialog *pDialog = NULL; IShellItem *pItem = NULL; LPWSTR pwszFilePath = NULL; // Create the FileOpenDialog object. hr = CoCreateInstance( __uuidof(FileOpenDialog), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDialog) ); if (FAILED(hr)) { goto done; } hr = pDialog->SetTitle(L"Select a File to Play"); if (FAILED(hr)) { goto done; } // Show the file-open dialog. hr = pDialog->Show(hwnd); if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { // User cancelled. hr = S_OK; goto done; } if (FAILED(hr)) { goto done; } hr = pDialog->GetResult(&pItem); if (FAILED(hr)) { goto done; } hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pwszFilePath); if (FAILED(hr)) { goto done; } // Open the file and create bitmaps. hr = OpenVideoFile(hwnd, pwszFilePath); done: if (FAILED(hr)) { ShowErrorMessage(L"Cannot open file.", hr); } CoTaskMemFree(pwszFilePath); SafeRelease(&pItem); SafeRelease(&pDialog); }
string get_directory(string dname, string caption) { //NOTE: This uses the Windows Vista or later file chooser, which is different than the one used by GM8 and lower //because I could not find out which one it uses, since IFileDialog is used by both wxWidgets and QtFramework //and there doesn't appear to be a standard file picker for XP or lower in the Windows API except SHBrowseForFolder that is //used by Game Maker for get_directory_alt IFileDialog* fileDialog; CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&fileDialog)); DWORD options; fileDialog->GetOptions(&options); options &= ~FOS_FILEMUSTEXIST; options &= ~FOS_PATHMUSTEXIST; fileDialog->SetOptions(options | FOS_PICKFOLDERS); //TODO: Set default directory to dname fileDialog->SetTitle(std::wstring(caption.begin(), caption.end()).c_str()); fileDialog->Show(enigma::hWnd); string res = ""; IShellItem *psi; if (SUCCEEDED(fileDialog->GetResult(&psi))) { LPWSTR wideres; psi->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &wideres); psi->Release(); //TODO: F**k Microsoft with a wooden spoon std::wstring wtf = wideres; res = string(wtf.begin(), wtf.end()); } return res; }
//----------------------------------------------------------------------------- bool VistaFileSelector::runModalInternal () { fileDialog = 0; HRESULT hr = -1; if (style == kSelectSaveFile) { hr = CoCreateInstance (CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IFileDialog, &fileDialog)); if (defaultSaveName) { fileDialog->SetFileName (UTF8StringHelper (defaultSaveName)); } } else { hr = CoCreateInstance (CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IFileDialog, &fileDialog)); if (SUCCEEDED (hr)) { if (style == kSelectDirectory) { DWORD dwOptions = 0; hr = fileDialog->GetOptions (&dwOptions); if (SUCCEEDED (hr)) hr = fileDialog->SetOptions (dwOptions | FOS_PICKFOLDERS); if (FAILED (hr)) { fileDialog->Release (); fileDialog = 0; return false; } } if (allowMultiFileSelection) { DWORD dwOptions = 0; hr = fileDialog->GetOptions (&dwOptions); if (SUCCEEDED (hr)) hr = fileDialog->SetOptions (dwOptions | FOS_ALLOWMULTISELECT); if (FAILED (hr)) { fileDialog->Release (); fileDialog = 0; return false; } } } } if (FAILED (hr)) { fileDialog = 0; return false; } if (title) hr = fileDialog->SetTitle (UTF8StringHelper (title)); DWORD numExtensions = 0; DWORD defaultFileTypeIndex = 0; COMDLG_FILTERSPEC* filters = buildExtensionFilter (extensions, defaultExtension, numExtensions, defaultFileTypeIndex); if (filters) { fileDialog->SetFileTypes (numExtensions, filters); if (defaultFileTypeIndex) fileDialog->SetFileTypeIndex (defaultFileTypeIndex); } if (initialPath && _SHCreateItemFromParsingName) { IShellItem* shellItem; hr = _SHCreateItemFromParsingName (UTF8StringHelper (initialPath), 0, IID_PPV_ARG (IShellItem, &shellItem)); if (SUCCEEDED (hr)) { fileDialog->SetFolder (shellItem); shellItem->Release (); } } Win32Frame* win32Frame = frame->getPlatformFrame () ? dynamic_cast<Win32Frame*> (frame->getPlatformFrame ()) : 0; hr = fileDialog->Show (win32Frame ? win32Frame->getPlatformWindow () : 0); if (SUCCEEDED (hr)) { if (allowMultiFileSelection) { IFileOpenDialog* openFileDialog = 0; hr = fileDialog->QueryInterface (IID_PPV_ARG(IFileOpenDialog, &openFileDialog)); if (SUCCEEDED (hr)) { IShellItemArray* items; hr = openFileDialog->GetResults (&items); if (SUCCEEDED (hr)) { DWORD count; hr = items->GetCount (&count); for (DWORD i = 0; i < count; i++) { IShellItem* item; hr = items->GetItemAt (i, &item); if (SUCCEEDED (hr)) { LPWSTR filesysPath = 0; hr = item->GetDisplayName (SIGDN_FILESYSPATH, &filesysPath); if (SUCCEEDED (hr)) { UTF8StringHelper str (filesysPath); UTF8StringBuffer resultPath = String::newWithString (str); result.push_back (resultPath); } item->Release (); } } items->Release (); } openFileDialog->Release (); } } else { IShellItem *item; hr = fileDialog->GetResult (&item); if (SUCCEEDED (hr)) { LPWSTR filesysPath = 0; hr = item->GetDisplayName (SIGDN_FILESYSPATH, &filesysPath); if (SUCCEEDED (hr)) { UTF8StringHelper str (filesysPath); UTF8StringBuffer resultPath = String::newWithString (str); result.push_back (resultPath); } item->Release (); } } } fileDialog->Release (); fileDialog = 0; freeExtensionFilter (filters); return SUCCEEDED (hr); }