HRESULT CreateShellItemFromHIDA(CIDA *pida, UINT iItem, IShellItem **ppsi) { *ppsi = NULL; HRESULT hr = E_FAIL; if (iItem < pida->cidl) { PIDLIST_ABSOLUTE pidlFolder; // needed for alignment hr = SHILCloneFull(IDA_GetFolderIDList(pida), &pidlFolder); if (SUCCEEDED(hr)) { PIDLIST_ABSOLUTE pidl; hr = SHILCombine(pidlFolder, IDA_GetItemIDList(pida, iItem), &pidl); if (SUCCEEDED(hr)) { // cast needed due to overload of the type of the 3rd param, when the first // 2 params are NULL this is an absolute IDList hr = SHCreateShellItem(NULL, NULL, reinterpret_cast<PCUITEMID_CHILD>(pidl), ppsi); CoTaskMemFree(pidl); } CoTaskMemFree(pidlFolder); } } return hr; }
HRESULT WINAPI SHCreateShellItemArray(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psf, UINT cidl, PCUITEMID_CHILD_ARRAY ppidl, IShellItemArray **ppsiItemArray) { IShellItemArrayImpl *This; IShellItem **array; HRESULT ret = E_FAIL; UINT i; TRACE("%p, %p, %d, %p, %p\n", pidlParent, psf, cidl, ppidl, ppsiItemArray); if(!pidlParent && !psf) return E_POINTER; if(!ppidl) return E_INVALIDARG; array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cidl*sizeof(IShellItem*)); if(!array) return E_OUTOFMEMORY; for(i = 0; i < cidl; i++) { ret = SHCreateShellItem(pidlParent, psf, ppidl[i], &array[i]); if(FAILED(ret)) break; } if(SUCCEEDED(ret)) { ret = IShellItemArray_Constructor(NULL, &IID_IShellItemArray, (void**)&This); if(SUCCEEDED(ret)) { This->array = array; This->item_count = cidl; *ppsiItemArray = &This->IShellItemArray_iface; return ret; } } /* Something failed, clean up. */ for(i = 0; i < cidl; i++) if(array[i]) IShellItem_Release(array[i]); HeapFree(GetProcessHeap(), 0, array); *ppsiItemArray = NULL; return ret; }
static HRESULT WINAPI ShellItem_GetParent(IShellItem2 *iface, IShellItem **ppsi) { ShellItem *This = impl_from_IShellItem2(iface); LPITEMIDLIST parent_pidl; HRESULT ret; TRACE("(%p,%p)\n", iface, ppsi); ret = ShellItem_get_parent_pidl(This, &parent_pidl); if (SUCCEEDED(ret)) { ret = SHCreateShellItem(NULL, NULL, parent_pidl, ppsi); ILFree(parent_pidl); } return ret; }
HRESULT WINAPI SHCreateShellItemArrayFromIDLists(UINT cidl, PCIDLIST_ABSOLUTE_ARRAY pidl_array, IShellItemArray **psia) { IShellItemArrayImpl *This; IShellItem **array; HRESULT ret; UINT i; TRACE("%d, %p, %p\n", cidl, pidl_array, psia); *psia = NULL; if(cidl == 0) return E_INVALIDARG; array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellItem*)); if(!array) return E_OUTOFMEMORY; for(i = 0; i < cidl; i++) { ret = SHCreateShellItem(NULL, NULL, pidl_array[i], &array[i]); if(FAILED(ret)) break; } if(SUCCEEDED(ret)) { ret = IShellItemArray_Constructor(NULL, &IID_IShellItemArray, (void**)psia); if(SUCCEEDED(ret)) { This = impl_from_IShellItemArray(*psia); This->array = array; This->item_count = cidl; return S_OK; } } for(i = 0; i < cidl; i++) if(array[i]) IShellItem_Release(array[i]); HeapFree(GetProcessHeap(), 0, array); *psia = NULL; return ret; }
HRESULT WINAPI SHCreateShellItemArrayFromIDLists(UINT cidl, PCIDLIST_ABSOLUTE_ARRAY pidl_array, IShellItemArray **psia) { IShellItem **array; HRESULT ret; UINT i; TRACE("%d, %p, %p\n", cidl, pidl_array, psia); *psia = NULL; if(cidl == 0) return E_INVALIDARG; array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cidl*sizeof(IShellItem*)); if(!array) return E_OUTOFMEMORY; for(i = 0; i < cidl; i++) { ret = SHCreateShellItem(NULL, NULL, pidl_array[i], &array[i]); if(FAILED(ret)) break; } if(SUCCEEDED(ret)) { ret = create_shellitemarray(array, cidl, psia); if(SUCCEEDED(ret)) return ret; } for(i = 0; i < cidl; i++) if(array[i]) IShellItem_Release(array[i]); HeapFree(GetProcessHeap(), 0, array); *psia = NULL; return ret; }
bool show() { #if defined(WIN32) std::wstring title16 = StringHelp::utf8_to_ucs2(title); std::wstring initial_directory16 = StringHelp::utf8_to_ucs2(initial_directory); if(is_vista_or_later()) { HRESULT result; ComPtr<IFileOpenDialog> open_dialog; result = CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_ALL, __uuidof(open_dialog), reinterpret_cast<void**>(open_dialog.output_variable())); throw_if_failed(result, "CoCreateInstance(FileOpenDialog) failed"); result = open_dialog->SetTitle(title16.c_str()); throw_if_failed(result, "IFileOpenDialog.SetTitle failed"); result = open_dialog->SetOptions(FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); throw_if_failed(result, "IFileOpenDialog.SetOptions((FOS_PICKFOLDERS) failed"); if(initial_directory16.length() > 0) { LPITEMIDLIST item_id_list = NULL; SFGAOF flags = 0; result = SHParseDisplayName(initial_directory16.c_str(), NULL, &item_id_list, SFGAO_FILESYSTEM, &flags); throw_if_failed(result, "SHParseDisplayName failed"); ComPtr<IShellItem> folder_item; result = SHCreateShellItem(NULL, NULL, item_id_list, folder_item.output_variable()); ILFree(item_id_list); throw_if_failed(result, "SHCreateItemFromParsingName failed"); /* This code requires Windows Vista or newer: ComPtr<IShellItem> folder_item; result = SHCreateItemFromParsingName(initial_directory16.c_str(), NULL, IID_PPV_ARGS(folder_item.output_variable())); throw_if_failed(result, "SHCreateItemFromParsingName failed"); */ if(!folder_item.is_null()) { result = open_dialog->SetFolder(folder_item); throw_if_failed(result, "IFileOpenDialog.SetFolder failed"); } } if(owner) result = open_dialog->Show(owner->get_display_window().get_hwnd()); else result = open_dialog->Show(0); if(SUCCEEDED(result)) { ComPtr<IShellItem> chosen_folder; result = open_dialog->GetResult(chosen_folder.output_variable()); throw_if_failed(result, "IFileOpenDialog.GetResult failed"); WCHAR *buffer = 0; result = chosen_folder->GetDisplayName(SIGDN_FILESYSPATH, &buffer); throw_if_failed(result, "IShellItem.GetDisplayName failed"); std::wstring output_directory16; try { output_directory16 = buffer; } catch (...) { CoTaskMemFree(buffer); throw; } CoTaskMemFree(buffer); selected_path = StringHelp::ucs2_to_utf8(output_directory16); return true; } else { return false; } } else { BROWSEINFO bi; ZeroMemory(&bi, sizeof(bi)); std::wstring::value_type path_buffer[FILENAME_MAX] = { 0 }; WCHAR Buffer[MAX_PATH]; memset(Buffer, 0, sizeof(WCHAR) * MAX_PATH); if(owner) bi.hwndOwner = owner->get_display_window().get_hwnd(); else bi.hwndOwner = 0; bi.pszDisplayName = Buffer; bi.lpszTitle = title16.c_str(); bi.ulFlags = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE; LPCITEMIDLIST pFolder = SHBrowseForFolder(&bi); if (pFolder == NULL) return false; if (!SHGetPathFromIDList(pFolder, path_buffer)) throw Exception("Bad path for Browse Folder Dialog"); selected_path = StringHelp::ucs2_to_utf8(path_buffer); return true; } #elif defined(__APPLE__) // To do: add cocoa code here return false; #elif defined(I_LOVE_AUTOHELL_AND_FIXED_THE_GTK_CHECK) if (!gtk_init_check(NULL, NULL)) throw Exception("gtk_init_check Failed!"); GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new ("Open File", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); //printf("%s\n", filename); g_free (filename); } gtk_widget_destroy (dialog); unsigned int x_time = System::get_time(); while(true) { if(owner) XSync(owner->get_display_window().get_display(), True); gtk_main_iteration_do(FALSE); unsigned int x_time_now = System::get_time(); if ((x_time_now - x_time) > 250) break; } bool success = false; return success; #else return false; #endif }
void Dlg_MemBookmark::ExportJSON() { if ( g_pCurrentGameData->GetGameID() == 0 ) { MessageBox( nullptr, _T("ROM not loaded: please load a ROM first!"), _T("Error!"), MB_OK ); return; } if ( m_vBookmarks.size() == 0) { MessageBox( nullptr, _T("No bookmarks to save: please create a bookmark before attempting to save."), _T("Error!"), MB_OK ); return; } std::string defaultDir = RA_DIR_BOOKMARKS; defaultDir.erase ( 0, 2 ); // Removes the characters (".\\") defaultDir = g_sHomeDir + defaultDir; IFileSaveDialog* pDlg = nullptr; HRESULT hr = CoCreateInstance( CLSID_FileSaveDialog, NULL, CLSCTX_ALL, IID_IFileSaveDialog, reinterpret_cast<void**>( &pDlg ) ); if ( hr == S_OK ) { hr = pDlg->SetFileTypes( ARRAYSIZE( c_rgFileTypes ), c_rgFileTypes ); if ( hr == S_OK ) { char defaultFileName[ 512 ]; sprintf_s ( defaultFileName, 512, "%s-Bookmarks.txt", std::to_string( g_pCurrentGameData->GetGameID() ).c_str() ); hr = pDlg->SetFileName( Widen( defaultFileName ).c_str() ); if ( hr == S_OK ) { PIDLIST_ABSOLUTE pidl; hr = SHParseDisplayName( Widen( defaultDir ).c_str(), NULL, &pidl, SFGAO_FOLDER, 0 ); if ( hr == S_OK ) { IShellItem* pItem = nullptr; SHCreateShellItem( NULL, NULL, pidl, &pItem ); hr = pDlg->SetDefaultFolder( pItem ); if ( hr == S_OK ) { pDlg->SetDefaultExtension( L"txt" ); hr = pDlg->Show( nullptr ); if ( hr == S_OK ) { hr = pDlg->GetResult( &pItem ); if ( hr == S_OK ) { LPWSTR pStr = nullptr; hr = pItem->GetDisplayName( SIGDN_FILESYSPATH, &pStr ); if ( hr == S_OK ) { Document doc; Document::AllocatorType& allocator = doc.GetAllocator(); doc.SetObject(); Value bookmarks( kArrayType ); for ( MemBookmark* bookmark : m_vBookmarks ) { Value item( kObjectType ); char buffer[ 256 ]; sprintf_s( buffer, Narrow( bookmark->Description() ).c_str(), sizeof( buffer ) ); Value s( buffer, allocator ); item.AddMember( "Description", s, allocator ); item.AddMember( "Address", bookmark->Address(), allocator ); item.AddMember( "Type", bookmark->Type(), allocator ); item.AddMember( "Decimal", bookmark->Decimal(), allocator ); bookmarks.PushBack( item, allocator ); } doc.AddMember( "Bookmarks", bookmarks, allocator ); _WriteBufferToFile( Narrow( pStr ), doc ); } pItem->Release(); ILFree( pidl ); } } } } } } pDlg->Release(); } }
bool show() { #ifdef WIN32 CL_String16 title16 = CL_StringHelp::utf8_to_ucs2(title); CL_String16 initial_directory16 = CL_StringHelp::utf8_to_ucs2(initial_directory); #ifndef __MINGW32__ if(is_vista_or_later()) { HRESULT result; CL_ComPtr<IFileOpenDialog> open_dialog; result = CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_ALL, __uuidof(open_dialog), reinterpret_cast<void**>(open_dialog.output_variable())); throw_if_failed(result, "CoCreateInstance(FileOpenDialog) failed"); result = open_dialog->SetTitle(title16.c_str()); throw_if_failed(result, "IFileOpenDialog.SetTitle failed"); result = open_dialog->SetOptions(FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); throw_if_failed(result, "IFileOpenDialog.SetOptions((FOS_PICKFOLDERS) failed"); if(initial_directory16.length() > 0) { LPITEMIDLIST item_id_list = NULL; SFGAOF flags = 0; result = SHParseDisplayName(initial_directory16.c_str(), NULL, &item_id_list, SFGAO_FILESYSTEM, &flags); throw_if_failed(result, "SHParseDisplayName failed"); CL_ComPtr<IShellItem> folder_item; result = SHCreateShellItem(NULL, NULL, item_id_list, folder_item.output_variable()); ILFree(item_id_list); throw_if_failed(result, "SHCreateItemFromParsingName failed"); /* This code requires Windows Vista or newer: CL_ComPtr<IShellItem> folder_item; result = SHCreateItemFromParsingName(initial_directory16.c_str(), NULL, IID_PPV_ARGS(folder_item.output_variable())); throw_if_failed(result, "SHCreateItemFromParsingName failed"); */ if(!folder_item.is_null()) { result = open_dialog->SetFolder(folder_item); throw_if_failed(result, "IFileOpenDialog.SetFolder failed"); } } if(owner) result = open_dialog->Show(owner->get_display_window().get_hwnd()); else result = open_dialog->Show(0); if(SUCCEEDED(result)) { CL_ComPtr<IShellItem> chosen_folder; result = open_dialog->GetResult(chosen_folder.output_variable()); throw_if_failed(result, "IFileOpenDialog.GetResult failed"); WCHAR *buffer = 0; result = chosen_folder->GetDisplayName(SIGDN_FILESYSPATH, &buffer); throw_if_failed(result, "IShellItem.GetDisplayName failed"); CL_String16 output_directory16; try { output_directory16 = buffer; } catch (...) { CoTaskMemFree(buffer); throw; } CoTaskMemFree(buffer); selected_path = CL_StringHelp::ucs2_to_utf8(output_directory16); return true; } else { return false; } } else #endif { BROWSEINFO bi; ZeroMemory(&bi, sizeof(bi)); CL_String16::char_type path_buffer[FILENAME_MAX] = { 0 }; WCHAR Buffer[MAX_PATH]; memset(Buffer, 0, sizeof(WCHAR) * MAX_PATH); if(owner) bi.hwndOwner = owner->get_display_window().get_hwnd(); else bi.hwndOwner = 0; bi.pszDisplayName = Buffer; bi.lpszTitle = title16.c_str(); bi.ulFlags = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE; LPCITEMIDLIST pFolder = SHBrowseForFolder(&bi); if (pFolder == NULL) return false; if (!SHGetPathFromIDList(pFolder, path_buffer)) throw CL_Exception("Bad path for Browse Folder Dialog"); selected_path = CL_StringHelp::ucs2_to_utf8(path_buffer); return true; } #else bool success = false; return success; #endif }