-- Browse.ew converted by Jeffrey Fielding (JJProg@cyberbury.net)
-- from VB code by Brad Martinez
-- Usage:
-- path = DoBrowseForFolder(title, hwnd)
-- Will return 0 on error, or the selected path.
-- title is the title for the dialog box
-- hwnd is the hwnd of the window the dialog is associated with
include machine.e
include dll.e
constant BIF_RETURNONLYFSDIRS = #1
constant SHITEMID_CB = 0, SHITEMID_ABID = 4, SIZEOF_SHITEMID = 8
constant SHELL32 = open_dll("shell32")
constant SHGetPathFromIDList = define_c_func(SHELL32,
"SHGetPathFromIDListA",{C_LONG, C_POINTER}, C_LONG)
constant SHGetSpecialFolderLocation = define_c_func(SHELL32,
"SHGetSpecialFolderLocation",{C_LONG,C_LONG,C_POINTER},C_LONG)
constant OLE32 = open_dll("ole32")
constant CoTaskMemFree = define_c_proc(OLE32,"CoTaskMemFree",{C_LONG})
constant SHBrowseForFolder = define_c_func(SHELL32,
"SHBrowseForFolderA",{C_POINTER},C_LONG)
constant BI_hOwner = 0,
BI_pidlRoot = 4,
BI_pszDisplayName = 8,
BI_lpszTitle = 12,
BI_ulFlags = 16,
BI_lpfn = 20,
BI_lParam = 24,
BI_iImage = 28,
SIZEOF_BI = 32
constant MAX_PATH = 260, SIZEOFszTYPENAME = 80
constant SHFILEINFO_hIcon = 0,
SHFILEINFO_iIcon = 4,
SHFILEINFO_dwAttributes = 8,
SHFILEINFO_szDisplayName = 12,
SHFILEINFO_szTypeName = 16,
SIZEOF_SHFILEINFO = 20
global function DoBrowseForFolder(sequence title, atom hwnd)
atom BI, nFolder, IDL, pIdl, sPath, displayName, lpszTitle, junk
sequence ret
BI = allocate(SIZEOF_BI)
IDL = allocate(SIZEOF_SHITEMID)
poke4(IDL,{0,0})
ret = ""
poke4(BI,repeat(0,8))
poke4(BI+BI_hOwner, hwnd)
nFolder = 0
if c_func(SHGetSpecialFolderLocation,{hwnd,nFolder,IDL}) = 0 then
poke(BI+BI_pidlRoot, peek({IDL+SHITEMID_CB, 4}))
end if
displayName = allocate_string(repeat(0,MAX_PATH))
poke4(BI+BI_pszDisplayName,displayName)
lpszTitle = allocate_string(title)
poke4(BI+BI_lpszTitle, lpszTitle)
poke4(BI+BI_ulFlags, BIF_RETURNONLYFSDIRS)
pIdl = c_func(SHBrowseForFolder,{BI})
if pIdl = 0 then
free(IDL)
free(lpszTitle)
free(displayName)
free(BI)
return 0
end if
sPath = allocate_string(repeat(0,MAX_PATH))
junk = c_func(SHGetPathFromIDList,{pIdl,sPath})
ret = peek({sPath,MAX_PATH+1})
ret = ret[1..find(0,ret)]
c_proc(CoTaskMemFree,{pIdl})
free(sPath)
free(lpszTitle)
free(displayName)
free(BI)
free(IDL)
return ret
end function