Now I trying to write a Fortran code which can display a dialog for selecting a directory by using SHBrowseForFolder. However I don't know the procedure to change the initial directory in SHBrowseForFolder. Doesn't someone know that for Fortran? My current Fortran code is as shown below.
program selectFolder
use ifwinty
use ifcom, only: COMInitialize, COMUnInitialize
implicit none
integer, parameter :: BIF_RETURNONLYFSDIRS = Z'00000001'
integer, parameter :: BIF_DONTGOBELOWDOMAIN = Z'00000002'
integer,parameter :: BIF_STATUSTEXT = Z'00000004'
integer,parameter :: BIF_RETURNFSANCESTORS = Z'00000008'
integer,parameter :: BIF_EDITBOX = Z'00000010'
integer,parameter :: BIF_VALIDATE = Z'00000020'
integer,parameter :: BIF_NEWDIALOGSTYLE = Z'00000040'
integer,parameter :: BIF_USENEWUI = ior(BIF_NEWDIALOGSTYLE,BIF_EDITBOX)
integer,parameter :: BIF_BROWSEINCLUDEURLS = Z'00000080'
integer,parameter :: BIF_UAHINT = Z'00000100'
integer,parameter :: BIF_NONEWFOLDERBUTTON = Z'00000200'
integer,parameter :: BIF_NOTRANSLATETARGETS = Z'00000400'
integer,parameter :: BIF_BROWSEFORCOMPUTER = Z'00001000'
integer,parameter :: BIF_BROWSEFORPRINTER = Z'00002000'
integer,parameter :: BIF_BROWSEINCLUDEFILES = Z'00004000'
integer,parameter :: BIF_SHAREABLE = Z'00008000'
integer,parameter :: BFFM_INITIALIZED = 1
type :: t_browseinfo
! sequence
integer(HANDLE) :: hwndOwner = NULL
integer(LPINT) :: pidlRoot = NULL
integer(LPSTR) :: pszDisplayName
integer(LPCSTR) :: lpszTitle
integer(UINT) :: ulFlags = BIF_RETURNONLYFSDIRS
integer(UINT) :: lpfn = NULL
integer(HANDLE) :: lParam = 0
integer :: iImage = 0
end type t_browseinfo
type(t_browseinfo) :: test
interface
integer function SHBrowseForFolder(t)
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'SHBrowseForFolder' :: SHBrowseForFolder
import
integer(LPINT), intent(in) :: t
end function SHBrowseForFolder
integer function SHGetPathFromIDList(pidl, pszPath)
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'SHGetPathFromIDList' :: SHGetPathFromIDList
import
integer(LPINT), intent(in) :: pidl
integer(LPINT), intent(in) :: pszPath
end function SHGetPathFromIDList
integer function CoTaskMemFree(pv)
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'CoTaskMemFree' :: CoTaskMemFree
import
integer(LPINT), intent(in) :: pv
end function CoTaskMemFree
end interface
character(len = *), parameter :: msg = "Select a directory!"C
character(len = 512) :: buff, path
integer(LPINT) :: status
integer(BOOL) :: iret
!
test%lpszTitle = loc(msg)
test%pszDisplayName = loc(buff)
status = SHBrowseForFolder(loc(test))
! print *, 'status=', status
if (status /= 0) then
iret = SHGetPathFromIDList(status, loc(path))
print *, path(:index(path, ""C))
print *, buff(:index(buff, ""C))
iret = CoTaskMemFree(status)
else
print *, 'No directory was selected !!'
end if
end program selectFolder