Try this, it's a mashup of a bunch of different code
Code: Select all
#Include Once "crt.bi"
#Include Once "windows.bi"
#Include Once "win/commdlg.bi"
#include Once "win/shlobj.bi"
#Ifndef _FILE_HELPERS_WIN32
#Define _FILE_HELPERS_WIN32
#Define FileOpenDialog(a,b,c,d,e) FileOpenSaveDialog(0,(a),(b),(c),(d),(e))
#Define FileSaveDialog(a,b,c,d,e) FileOpenSaveDialog(1,(a),(b),(c),(d),(e))
Dim Shared as Integer OFS_FILE_OPEN_FLAGS = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_CREATEPROMPT _
Or OFN_NODEREFERENCELINKS
Dim Shared As Integer OFS_FILE_SAVE_FLAGS = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_OVERWRITEPROMPT _
Or OFN_HIDEREADONLY
Declare Function FileOpenSaveDialog(iMode As Integer,ByVal szTitle As ZString Ptr , ByVal szInitialDir As ZString Ptr, ByVal _szFilter As ZString Ptr, ByVal iFlags As Dword, ByVal szName As ZString Ptr) as String
Declare Function FileSelectFolder_callback (Byval hwndbrowse As HWND, Byval uMsg As UINT, Byval lp As LPARAM, Byval lpData As LPARAM) As Integer
Declare Function FileSelectFolder (Byref title As String = "Choose A Folder",ByVal nCSIDL As Integer, ulFlags As ULong =BIF_NEWDIALOGSTYLE, ByRef sz_InitialDir As String) As String
Type FOLDER_PROPS
Dim lpszTitle As ZString Ptr
Dim lpszInitialFolder As ZString Ptr
Dim As UInteger ulFlags
End Type
Function FileOpenSaveDialog(iMode as Integer, ByVal szTitle As ZString Ptr , ByVal szInitialDir As ZString Ptr, ByVal _szFilter As ZString Ptr, ByVal iFlags As Dword, ByVal szName As ZString Ptr) as String
Dim ofn As OPENFILENAME
Dim buff As ZString*260
Dim sz_Filter as ZString Ptr
Dim iIndex As UInteger
ofn.lStructSize=SizeOf(OPENFILENAME)
ofn.hwndOwner=NULL
ofn.hInstance=GetModuleHandle(NULL)
ofn.lpstrInitialDir= szInitialDir
buff=String(260,0)
If szName Then
StrCpy(buff,szName)
EndIf
ofn.lpstrFile=@buff
ofn.nMaxFile=260
sz_Filter = malloc(StrLen(_szFilter)+2)
StrCpy(sz_Filter,_szFilter)
sz_Filter[StrLen(sz_Filter)+1] = 0
For iIndex = 0 To StrLen(sz_Filter) - 1
If sz_Filter[iIndex] = Asc("|") Then sz_Filter[iIndex] = 0
Next iIndex
ofn.lpstrFilter = sz_Filter
ofn.lpstrTitle = szTitle
If iFlags = 0 Then
ofn.Flags = iFlags
EndIf
If iMode = 0 Then
If GetOpenFileName(@ofn) Then Function = buff
Else
If GetSaveFileName(@ofn) Then Function = buff
EndIf
free(sz_Filter)
End Function
Function FileSelectFolder_callback (Byval hwndbrowse As HWND, Byval uMsg As UINT, _
Byval lp As LPARAM, Byval lpData As LPARAM) As Integer
If uMsg = BFFM_INITIALIZED Then
Dim fp As FOLDER_PROPS Ptr
fp = Cast(FOLDER_PROPS Ptr, lpData)
if fp Then
if (*fp).lpszInitialFolder Then
If (*fp).lpszInitialFolder[0] <> 0 Then
' set initial directory
SendMessage(hwndbrowse, BFFM_SETSELECTION, TRUE, Cast(LPARAM,fp->lpszInitialFolder))
endif
EndIf
if fp->lpszTitle Then
If (fp->lpszTitle[0] <>0) Then
' // set window caption
SetWindowText(hwndbrowse, fp->lpszTitle)
endif
EndIf
EndIf
EndIf
Return 0
End Function
Function FileSelectFolder (Byref title As String = "Choose A Folder", ByVal nCSIDL As Integer, iFlags As ULong = BIF_EDITBOX, ByRef sz_InitialDir As String) As String
Dim bi As BROWSEINFO
Dim pidl As LPITEMIDLIST
Dim ret As HRESULT
Dim physpath As Zstring * MAX_PATH
Dim dispname As Zstring * MAX_PATH
Dim fp As FOLDER_PROPS
bi.hwndOwner = HWND_DESKTOP
If nCSIDL Then
ret = SHGetSpecialFolderLocation(HWND_DESKTOP, nCSIDL, @bi.pidlRoot)
'ret = SHGetFolderLocation(HWND_DESKTOP, nCSIDL, NULL, NULL, @bi.pidlRoot)
Else
'ret = SHGetSpecialFolderLocation(HWND_DESKTOP, CSIDL_DESKTOP, @bi.pidlRoot)
ret = SHGetFolderLocation(HWND_DESKTOP, CSIDL_DESKTOP , NULL, NULL, @bi.pidlRoot)
EndIf
fp.lpszTitle = StrPtr(Title)
fp.lpszInitialFolder = StrPtr(sz_InitialDir)
fp.ulFlags = iFlags
bi.pszDisplayName = @dispname
bi.lpszTitle = Strptr(title)
bi.ulFlags = iFlags
bi.lpfn = @FileSelectFolder_callback
bi.lParam = Cast(LPARAM,VarPtr(fp))
bi.iImage = 0
pidl = SHBrowseForFolder(@bi)
If pidl <> 0 Then
If SHGetPathFromIDList(pidl, physpath) = 0 Then
Function = ""
Else
Function = physpath
End If
CoTaskMemFree pidl
Else
Function = ""
End If
CoTaskMemFree bi.pidlRoot
End Function
#EndIf
Usage:
Code: Select all
Dim buff As ZString*260
Dim ofnFlags As Integer
'FileOpen
ofnFlags = OFN_LONGNAMES Or OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or OFN_EXPLORER
buff = FileOpenDialog("Open","C:\Program Files\FreeBasic\examples","FreeBasic(*.bas;*.bi)|*.bas;*.bi|All(*.*)|*.*",ofnFlags,"")
'FileSave
ofnFlags = OFN_LONGNAMES Or OFN_PATHMUSTEXIST Or OFN_OVERWRITEPROMPT Or OFN_HIDEREADONLY
buff = FileSaveDialog("Save","C:\Program Files\FreeBasic\examples","FreeBasic(*.bas;*.bi)|*.bas;*.bi|All(*.*)|*.*",ofnFlags,"untitled.bas")
'Select Folder
ofnFlags = BIF_NEWDIALOGSTYLE Or BIF_RETURNONLYFSDIRS
buff = FileSelectFolder("Select Folder",0,ofnFlags,"C:\Program Files")
provides File save, File Open and Folder Select dialogs.
edit: replaced ofn.hInstance = hInstance with ofn.hInstance = GetModuleHandle(NULL). Thx BasicScience.
The program I pulled it from had hInstance set shared.