private static IShellItem CreateFolderShellItem(string path) { IShellItem shellItem; path = Path.GetFullPath(path); if (FileSystem.DoesPathExist(path)) { shellItem = CreateShellItem(path); } else { using (var bindCtxReleaser = new ComReleaser <IBindCtx>(NativeMethods.CreateBindCtx())) { IBindCtx bindCtx = bindCtxReleaser.ComObject; bindCtx.RegisterObjectParam ( NativeMethods.STR_FILE_SYS_BIND_DATA, CreateFolderIfDoesntExistsFileSystemBindData ); shellItem = CreateShellItem(path, bindCtx); } } return(shellItem); }
void CreateBindCtx(out IBindCtx pbc) { System.Runtime.InteropServices.ComTypes.BIND_OPTS bo = new System.Runtime.InteropServices.ComTypes.BIND_OPTS() { cbStruct = Marshal.SizeOf(typeof(System.Runtime.InteropServices.ComTypes.BIND_OPTS)), dwTickCountDeadline = 0, grfFlags = 0, grfMode = STGM_CREATE }; try { PInvoke.CreateBindCtx(0, out pbc); pbc.SetBindOptions(ref bo); pbc.RegisterObjectParam(STR_FILE_SYS_BIND_DATA, (IFileSystemBindData)this); } catch { pbc = null; throw; } }