在Fortran中更改SHBrowseForFolder的初始目录可以通过以下步骤实现:
use, intrinsic :: iso_c_binding
interface
! 定义Windows API函数和数据类型
function SHBrowseForFolder(lpbi As type(c_ptr)) bind(C, name='SHBrowseForFolderA')
import
type(c_ptr), value :: lpbi
type(c_ptr) :: SHBrowseForFolder
end function SHBrowseForFolder
function SHGetPathFromIDList(pidl As type(c_ptr), pszPath As type(c_ptr)) bind(C, name='SHGetPathFromIDListA')
import
type(c_ptr), value :: pidl
type(c_ptr), value :: pszPath
type(c_int) :: SHGetPathFromIDList
end function SHGetPathFromIDList
subroutine CoTaskMemFree(pv As type(c_ptr)) bind(C, name='CoTaskMemFree')
import
type(c_ptr), value :: pv
end subroutine CoTaskMemFree
type, bind(C) :: ITEMIDLIST
sequence
type(c_short) :: mkid.cb
type(c_ushort) :: mkid.abID(:)
end type ITEMIDLIST
type, bind(C) :: BROWSEINFO
type(c_ptr) :: hwndOwner
type(c_ptr) :: pidlRoot
type(c_ptr) :: pszDisplayName
type(c_char) :: lpszTitle(*) ! 标题
type(c_int) :: ulFlags
type(c_ptr) :: lpfn
type(c_long) :: lParam
type(c_ptr) :: iImage
end type BROWSEINFO
type, bind(C) :: CoTaskMemAlloc
sequence
type(c_size_t) :: cb
end type CoTaskMemAlloc
end interface
subroutine SetInitialFolder(initialFolder)
character(len=*), intent(in) :: initialFolder
type(BROWSEINFO) :: bi
type(ITEMIDLIST), pointer :: pidl
character(len=:), allocatable :: pszPath
type(CoTaskMemAlloc) :: ctmAlloc
! 初始化BROWSEINFO结构体
bi%hwndOwner = c_null_ptr
bi%pidlRoot = c_null_ptr
bi%pszDisplayName = c_null_ptr
bi%lpszTitle = c_null_ptr
bi%ulFlags = 0
bi%lpfn = c_null_ptr
bi%lParam = 0
bi%iImage = c_null_ptr
! 设置初始目录
if (len_trim(initialFolder) > 0) then
! 分配内存以存储初始目录路径
ctmAlloc%cb = (len(initialFolder) + 1) * c_sizeof(c_char)
pszPath = c_loc(ctmAlloc)
! 将初始目录路径复制到分配的内存中
call c_f_pointer(pszPath, pszPathChar)
pszPathChar = initialFolder // c_null_char
! 设置BROWSEINFO结构体的pidlRoot字段
bi%pidlRoot = c_loc(pszPath)
end if
! 调用SHBrowseForFolder函数
pidl = SHBrowseForFolder(c_loc(bi))
! 获取所选文件夹的路径
if (associated(pidl)) then
pszPath = c_loc(ctmAlloc)
call SHGetPathFromIDList(c_loc(pidl), pszPath)
call c_f_pointer(pszPath, pszPathChar)
print *, "选择的文件夹路径:", trim(pszPathChar)
end if
! 释放内存
if (associated(pidl)) then
call CoTaskMemFree(c_loc(pidl))
end if
if (allocated(pszPath)) then
call CoTaskMemFree(c_loc(pszPath))
end if
end subroutine SetInitialFolder
program main
call SetInitialFolder("C:\Path\To\Initial\Folder")
end program main
这样,当运行Fortran程序时,SHBrowseForFolder对话框将显示初始目录为"C:\Path\To\Initial\Folder"。请注意,为了使上述代码正常工作,您需要在Windows操作系统上编译和运行Fortran程序,并且需要将Windows API函数和数据类型正确导入到Fortran代码中。
领取专属 10元无门槛券
手把手带您无忧上云