Windows Vista Folder Selection
From NSIS Wiki
(Redirected from Vista Folder Selection)
Jump to navigationJump to search
!include "LogicLib.nsh" Name "test" OutFile "test.exe" XPStyle on ShowInstDetails show RequestExecutionLevel user Page instfiles Function BrowseForFolder !define CLSID_FileOpenDialog {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7} !define IID_IFileDialog {42F85136-DB7E-439C-85F1-E4075D135FC8} !define CLSCTX_INPROC_SERVER 1 !define FOS_PICKFOLDERS 32 !define FOS_FORCEFILESYSTEM 64 !define SIGDN_FILESYSPATH 2147844096 Push $4 Push $3 Push $2 Push $1 Push $0 System::Call "ole32::CoCreateInstance(g '${CLSID_FileOpenDialog}', i 0, i ${CLSCTX_INPROC_SERVER}, g '${IID_IFileDialog}', *i .r0) i.r1" ${If} $1 == 0 StrCpy $4 "error" System::Call "$0->9(i ${FOS_PICKFOLDERS}|${FOS_FORCEFILESYSTEM}) i.r1" ; IFileDialog::SetOptions ${If} $1 <> 0 System::Call "$0->2()" ; IFileDialog::Release Goto end ${EndIf} System::Call "$0->3(i 0) i.r1" ; IFileDialog::Show ${If} $1 <> 0 System::Call "$0->2()" ; IFileDialog::Release Goto end ${EndIf} System::Call "$0->20(*i .r2) i.r1" ; IFileDialog::GetResult System::Call "$0->2()" ; IFileDialog::Release ${If} $1 == 0 System::Call "$2->5(i ${SIGDN_FILESYSPATH}, *i .r3) i.r1" ; IShellItem::GetDisplayName ${If} $1 == 0 System::Call "*$3(&w${NSIS_MAX_STRLEN} .r4)" System::Call "ole32::CoTaskMemFree(i $3)" ${EndIf} System::Call "$2->2()" ; IShellItem::Release ${EndIf} ${Else} ; fallback for pre-Vista Windows version nsDialogs::SelectFolderDialog "" "" Pop $4 ${EndIf} end: Pop $0 Pop $1 Pop $2 Pop $3 Exch $4 FunctionEnd Section "" Call BrowseForFolder Pop $0 DetailPrint $0 SectionEnd