static int ChangeFolder(ShellDebuggerModel model, IntPtr pidl, SBSP wFlags, IShellFolder folderTmp, IntPtr pidlTmp) { model.currentFolder = folderTmp; var Form = model.Form; FOLDERSETTINGS fs = new FOLDERSETTINGS(); IShellView lastIShellView = model.ShellView; IShellView2 lastIShellView2 = model.ShellView as IShellView2; if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); } // Copy the old folder settings else { fs = new FOLDERSETTINGS(); fs.fFlags = ShellDebuggerModel.folderFlags; fs.ViewMode = ShellDebuggerModel.folderViewMode; } // Create the IShellView IntPtr iShellViewPtr; var shellViewGuid = typeof(IShellView).GUID; var hr = ShellObject.CreateViewObject(folderTmp, Form.Handle, ref shellViewGuid, out iShellViewPtr); if (hr != WinError.S_OK) { shellViewGuid = typeof(IShellView).GUID; hr = ShellObject.CreateViewObject(folderTmp, Form.Handle, ref shellViewGuid, out iShellViewPtr); } if (hr == WinError.S_OK) { model.ShellView = null; model.ShellView = (IShellView) // IShellView2 Marshal.GetObjectForIUnknown(iShellViewPtr); //if (model.ShellView == null) // model.ShellView = (IShellView) // Marshal.GetObjectForIUnknown(iShellViewPtr); // int CreateViewWindow2(SV2CVW2_PARAMS lpParams); var hWndListView = IntPtr.Zero; RECT rc = new RECT(0, 0, Form.ClientSize.Width, Form.ClientSize.Height); int res; model.lastViewPidl = IntPtr.Zero; var shellView = model.ShellView; try { // Create the actual list view. res = shellView.CreateViewWindow(lastIShellView, ref fs, model, ref rc, ref hWndListView); model.hWndListView = hWndListView; shellView.EnableModeless(true); } catch (COMException) { return(WinError.E_FAIL); } if (res < 0) { return(WinError.E_FAIL); } // Release the old IShellView if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); lastIShellView.UIActivate(SVUIA_STATUS.SVUIA_DEACTIVATE); lastIShellView.DestroyViewWindow(); } // Set focus to the IShellView model.ShellView.UIActivate(SVUIA_STATUS.SVUIA_ACTIVATE_FOCUS); model.currentAbsolutePidl = pidlTmp; if (model.lastViewPidl != IntPtr.Zero) { // var lastItem = model.LastSelected; } //else //{ // // empty list //} } return(WinError.S_OK); }