HRESULT v_ExecuteLibCommand() { // Get the private and public save locations. IShellItem *psiPrivateSaveLoc; HRESULT hr = _plib->GetDefaultSaveFolder(DSFT_PRIVATE, IID_PPV_ARGS(&psiPrivateSaveLoc)); if (SUCCEEDED(hr)) { IShellItem *psiPublicSaveLoc; hr = _plib->GetDefaultSaveFolder(DSFT_PUBLIC, IID_PPV_ARGS(&psiPublicSaveLoc)); if (SUCCEEDED(hr)) { // Get the list of folders that match the specified filter. IShellItemArray *psiaFolders; hr = _plib->GetFolders(_lffFilter, IID_PPV_ARGS(&psiaFolders)); if (SUCCEEDED(hr)) { DWORD cFolders; hr = psiaFolders->GetCount(&cFolders); if (SUCCEEDED(hr)) { Output(L"Library contains %u folders:\n", cFolders); for (DWORD iFolder = 0; iFolder < cFolders; iFolder++) { IShellItem *psiFolder; if (SUCCEEDED(psiaFolders->GetItemAt(iFolder, &psiFolder))) { // Print each folder's name as an absolute path, suitable for parsing in the Shell Namespace (e.g SHParseDisplayName). // For file system folders (the typical case), this will be the file system path of the folder. PWSTR pszDisplay; if (SUCCEEDED(psiFolder->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszDisplay))) { PCWSTR pszPrefix = L" "; int iCompare; if (S_OK == psiPrivateSaveLoc->Compare(psiFolder, SICHINT_CANONICAL | SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL, &iCompare)) { pszPrefix = L"* "; } else if (S_OK == psiPublicSaveLoc->Compare(psiFolder, SICHINT_CANONICAL | SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL, &iCompare)) { pszPrefix = L"# "; } Output(L"%s%s\n", pszPrefix, pszDisplay); CoTaskMemFree(pszDisplay); } psiFolder->Release(); } } } psiaFolders->Release(); } psiPublicSaveLoc->Release(); } psiPrivateSaveLoc->Release(); } return hr; }
// @pymethod int|PyIShellItem|Compare|Compares another shell item with this item // @rdesc Returns 0 if items compare as equal, nonzero otherwise PyObject *PyIShellItem::Compare(PyObject *self, PyObject *args) { IShellItem *pISI = GetI(self); if ( pISI == NULL ) return NULL; // @pyparm <o PyIShellItem>|psi||A shell item to be compared with this item SICHINTF hint; // @pyparm int|hint||shellcon.SICHINT_* value indicating how the comparison is to be performed PyObject *obpsi; IShellItem *psi; if ( !PyArg_ParseTuple(args, "Oi:Compare", &obpsi, &hint) ) return NULL; if (!PyCom_InterfaceFromPyInstanceOrObject(obpsi, IID_IShellItem, (void **)&psi, FALSE)) return NULL; HRESULT hr; int iOrder; PY_INTERFACE_PRECALL; hr = pISI->Compare( psi, hint, &iOrder ); psi->Release(); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pISI, IID_IShellItem ); return PyInt_FromLong(iOrder); }
// Determines if the provided IShellItem is listed in the array of items that the user has removed bool _IsItemInArray(IShellItem *psi, IObjectArray *poaRemoved) { bool fRet = false; UINT cItems; if (SUCCEEDED(poaRemoved->GetCount(&cItems))) { IShellItem *psiCompare; for (UINT i = 0; !fRet && i < cItems; i++) { if (SUCCEEDED(poaRemoved->GetAt(i, IID_PPV_ARGS(&psiCompare)))) { int iOrder; fRet = SUCCEEDED(psiCompare->Compare(psi, SICHINT_CANONICAL, &iOrder)) && (0 == iOrder); psiCompare->Release(); } } } return fRet; }