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;
}
Пример #2
0
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;
}