HRESULT GetSelectionFromSite(IUnknown *punkSite, BOOL fNoneImpliesFolder, IShellItemArray **ppsia) { *ppsia = NULL; IFolderView2 *pfv; HRESULT hr = IUnknown_QueryService(punkSite, SID_SFolderView, IID_PPV_ARGS(&pfv)); if (SUCCEEDED(hr)) { hr = pfv->GetSelection(fNoneImpliesFolder, ppsia); pfv->Release(); } return hr; }
BOOL GetSelectedItems(IFileDialog *fd, vector<Wstr> *res) { IFolderView2 *fv = NULL; if (FAILED(IUnknown_QueryService(fd, SID_SFolderView, IID_PPV_ARGS(&fv)))) return FALSE; scope_defer([&](){ fv->Release(); }); IShellItemArray *sia = NULL; if (FAILED(fv->GetSelection(TRUE, &sia))) return FALSE; scope_defer([&](){ sia->Release(); }); DWORD num = 0; if (FAILED(sia->GetCount(&num))) return FALSE; for (DWORD i=0; i < num; i++) { IShellItem *si = NULL; if (FAILED(sia->GetItemAt(i, &si))) return FALSE; scope_defer([&](){ si->Release(); }); // LPITEMIDLIST idl; // DWORD val = 0; // if (SUCCEEDED(::SHGetIDListFromObject(si, &idl))) { // PITEMID_CHILD ic = ILFindLastID(idl); // HRESULT hr = fv->GetSelectionState(ic, &val); // DBG("hr=%x val=%x\n", hr, val); // } PWSTR path = NULL; if (FAILED(si->GetDisplayName(SIGDN_FILESYSPATH, &path))) continue; scope_defer([&](){ ::CoTaskMemFree(path); }); res->push_back(path); DBGW(L"path=%s\n", path); } return TRUE; }