// @pymethod |PyIShellView|SelectItem|Description of SelectItem. PyObject *PyIShellView::SelectItem(PyObject *self, PyObject *args) { IShellView *pISV = GetI(self); if ( pISV == NULL ) return NULL; // @pyparm <o PyIDL>|pidlItem||Description for pidlItem // @pyparm int|uFlags||Description for uFlags PyObject *obpidlItem; INT iuFlags; LPITEMIDLIST pidlItem; SVSIF uFlags; if ( !PyArg_ParseTuple(args, "Oi:SelectItem", &obpidlItem, &iuFlags) ) return NULL; BOOL bPythonIsHappy = TRUE; if (bPythonIsHappy && !PyObject_AsPIDL(obpidlItem, &pidlItem, TRUE)) bPythonIsHappy = FALSE; uFlags = iuFlags; if (!bPythonIsHappy) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pISV->SelectItem( pidlItem, uFlags ); PyObject_FreePIDL(pidlItem); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pISV, IID_IShellView ); Py_INCREF(Py_None); return Py_None; }
bool CDeskBand::FindPaths() { m_currentDirectory.clear(); m_selectedItems.clear(); m_bFilesSelected = false; m_bFolderSelected = false; if (m_pSite == NULL) return false; IServiceProvider * pServiceProvider; if (SUCCEEDED(m_pSite->QueryInterface(IID_IServiceProvider, (LPVOID*)&pServiceProvider))) { IShellBrowser * pShellBrowser; if (SUCCEEDED(pServiceProvider->QueryService(SID_SShellBrowser, IID_IShellBrowser, (LPVOID*)&pShellBrowser))) { IShellView * pShellView; if (SUCCEEDED(pShellBrowser->QueryActiveShellView(&pShellView))) { IFolderView * pFolderView; if (SUCCEEDED(pShellView->QueryInterface(IID_IFolderView, (LPVOID*)&pFolderView))) { // hooray! we got the IFolderView interface! // that means the explorer is active and well :) // but we also need the IShellFolder interface because // we need its GetCurFolder() method IPersistFolder2 * pPersistFolder; if (SUCCEEDED(pFolderView->GetFolder(IID_IPersistFolder2, (LPVOID*)&pPersistFolder))) { LPITEMIDLIST folderpidl; if (SUCCEEDED(pPersistFolder->GetCurFolder(&folderpidl))) { // we have the current folder TCHAR buf[MAX_PATH] = {0}; // find the path of the folder if (SHGetPathFromIDList(folderpidl, buf)) { m_currentDirectory = buf; } // if m_currentDirectory is empty here, that means // the current directory is a virtual path IShellFolder * pShellFolder; if (SUCCEEDED(pPersistFolder->QueryInterface(IID_IShellFolder, (LPVOID*)&pShellFolder))) { // if there was a new folder created but not found to set into editing mode, // we try here to do that if (!m_newfolderPidls.empty()) { int nCount2 = 0; IShellFolder * pShellFolder; if (SUCCEEDED(pPersistFolder->QueryInterface(IID_IShellFolder, (LPVOID*)&pShellFolder))) { if (SUCCEEDED(pFolderView->ItemCount(SVGIO_ALLVIEW, &nCount2))) { for (int i=0; i<nCount2; ++i) { LPITEMIDLIST pidl; pFolderView->Item(i, &pidl); bool bFound = false; for (std::vector<LPITEMIDLIST>::iterator it = m_newfolderPidls.begin(); it != m_newfolderPidls.end(); ++it) { HRESULT hr = pShellFolder->CompareIDs(0, pidl, *it); if (HRESULT_CODE(hr) == 0) { // this item was there before, so it's not the new folder CoTaskMemFree(*it); m_newfolderPidls.erase(it); bFound = true; break; } } if (!bFound) { pShellView->SelectItem(pidl, SVSI_EDIT); } CoTaskMemFree(pidl); } } if ((nCount2)||(m_newfolderTimeoutCounter-- <= 0)) { m_newfolderTimeoutCounter = 0; for (std::vector<LPITEMIDLIST>::iterator it = m_newfolderPidls.begin(); it != m_newfolderPidls.end(); ++it) { CoTaskMemFree(*it); } m_newfolderPidls.clear(); } pShellFolder->Release(); } } // find all selected items IEnumIDList * pEnum; if (SUCCEEDED(pFolderView->Items(SVGIO_SELECTION, IID_IEnumIDList, (LPVOID*)&pEnum))) { LPITEMIDLIST pidl; WCHAR buf[MAX_PATH] = {0}; ULONG fetched = 0; ULONG attribs = 0; do { pidl = NULL; if (SUCCEEDED(pEnum->Next(1, &pidl, &fetched))) { if (fetched) { // the pidl we get here is relative! attribs = SFGAO_FILESYSTEM|SFGAO_FOLDER; if (SUCCEEDED(pShellFolder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &attribs))) { if (attribs & SFGAO_FILESYSTEM) { // create an absolute pidl with the pidl we got above LPITEMIDLIST abspidl = CPidl::Append(folderpidl, pidl); if (abspidl) { if (SHGetPathFromIDList(abspidl, buf)) { m_selectedItems[std::wstring(buf)] = attribs; if (m_currentDirectory.empty()) { // remove the last part of the path of the selected item WCHAR * pSlash = _tcsrchr(buf, '\\'); if (pSlash) *pSlash = 0; m_currentDirectory = std::wstring(buf); } } CoTaskMemFree(abspidl); } if (attribs & SFGAO_FOLDER) m_bFolderSelected = true; else m_bFilesSelected = true; } } } CoTaskMemFree(pidl); } } while(fetched); pEnum->Release(); } pShellFolder->Release(); } CoTaskMemFree(folderpidl); } pPersistFolder->Release(); } pFolderView->Release(); } pShellView->Release(); } pShellBrowser->Release(); } pServiceProvider->Release(); } return ((!m_currentDirectory.empty()) || (!m_selectedItems.empty())); }