// @pymethod |PyIFileOperation|SetOwnerWindow|Sets the parent window for any UI displayed. PyObject *PyIFileOperation::SetOwnerWindow(PyObject *self, PyObject *args) { IFileOperation *pIFO = GetI(self); if ( pIFO == NULL ) return NULL; // @pyparm <o PyHANDLE>|Owner||Handle to parent window HWND Owner; if ( !PyArg_ParseTuple(args, "O&:SetOwnerWindow", PyWinObject_AsHANDLE, &Owner)) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIFO->SetOwnerWindow(Owner); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIFO, IID_IFileOperation ); Py_INCREF(Py_None); return Py_None; }
bool OsShell::deleteItems(const std::vector<std::wstring>& items, bool moveToTrash, void * parentWindow) { ComInitializer comInitializer; assert_r(parentWindow); std::vector<ITEMIDLIST*> idLists; for (auto& path: items) { __unaligned ITEMIDLIST* idl = ILCreateFromPathW(path.c_str()); if (!idl) { for (auto& pid : idLists) ILFree(pid); qInfo() << "ILCreateFromPathW" << "failed for path" << QString::fromWCharArray(path.c_str()); return false; } idLists.push_back(idl); assert_r(idLists.back()); } IShellItemArray * iArray = 0; HRESULT result = SHCreateShellItemArrayFromIDLists((UINT)idLists.size(), (LPCITEMIDLIST*)idLists.data(), &iArray); // Freeing memory for (auto& pid: idLists) ILFree(pid); idLists.clear(); if (!SUCCEEDED(result) || !iArray) { qInfo() << "SHCreateShellItemArrayFromIDLists failed"; return false; } IFileOperation * iOperation = 0; result = CoCreateInstance(CLSID_FileOperation, 0, CLSCTX_ALL, IID_IFileOperation, (void**)&iOperation); if (!SUCCEEDED(result) || !iOperation) { qInfo() << "CoCreateInstance(CLSID_FileOperation, 0, CLSCTX_ALL, IID_IFileOperation, (void**)&iOperation) failed"; return false; } result = iOperation->DeleteItems(iArray); if (!SUCCEEDED(result)) { qInfo() << "DeleteItems failed"; } else { if (moveToTrash) { result = iOperation->SetOperationFlags(FOF_ALLOWUNDO); } else result = iOperation->SetOperationFlags(FOF_WANTNUKEWARNING); if (!SUCCEEDED(result)) qInfo() << "SetOperationFlags failed"; result = iOperation->SetOwnerWindow((HWND) parentWindow); if (!SUCCEEDED(result)) qInfo() << "SetOwnerWindow failed"; result = iOperation->PerformOperations(); if (!SUCCEEDED(result) && result != COPYENGINE_E_USER_CANCELLED) { qInfo() << "PerformOperations failed"; if (result == COPYENGINE_E_REQUIRES_ELEVATION) qInfo() << "Elevation required"; } else result = S_OK; } iOperation->Release(); iArray->Release(); return SUCCEEDED(result); }