// @pymethod int|PyIShellItem|GetAttributes|Returns shell attributes of the item // @rdesc Returns a combination of shellcon.SFGAO_* values PyObject *PyIShellItem::GetAttributes(PyObject *self, PyObject *args) { IShellItem *pISI = GetI(self); if ( pISI == NULL ) return NULL; SFGAOF sfgaoMask; SFGAOF ret; // @pyparm int|Mask||Combination of shellcon.SFGAO_* values indicating the flags to return if ( !PyArg_ParseTuple(args, "k:GetAttributes", &sfgaoMask) ) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pISI->GetAttributes( sfgaoMask, &ret); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pISI, IID_IShellItem ); return PyLong_FromUnsignedLong(ret); }
IFACEMETHODIMP OnSelectionChange(IFileDialog *pfd) { // Update the text of the Open/Add button here based on the selection IShellItem *psi; HRESULT hr = pfd->GetCurrentSelection(&psi); if (SUCCEEDED(hr)) { SFGAOF attr; hr = psi->GetAttributes(SFGAO_FOLDER | SFGAO_STREAM, &attr); if (SUCCEEDED(hr) && (SFGAO_FOLDER == attr)) { pfd->SetOkButtonLabel(L"Open"); } else { pfd->SetOkButtonLabel(L"Add"); } psi->Release(); } return S_OK; }
void getPaths(IShellItemArray* shellItems, Vector<Path>& paths) { DWORD numShellItems; shellItems->GetCount(&numShellItems); for (DWORD i = 0; i < numShellItems; ++i) { IShellItem* shellItem = nullptr; shellItems->GetItemAt(i, &shellItem); SFGAOF attribs; shellItem->GetAttributes(SFGAO_FILESYSTEM, &attribs); if (!(attribs & SFGAO_FILESYSTEM)) continue; LPWSTR name; shellItem->GetDisplayName(SIGDN_FILESYSPATH, &name); paths.push_back((Path)UTF8::fromWide(WString(name))); CoTaskMemFree(name); } }