フォルダ選択ダイアログの場合は面倒でコールバック関数を用意しなければなりません。
コールバック関数の中で初期フォルダを指定する必要があります。
私はString型が好きなので戻り値としてパスを返すようにしました。
OpenFolderの2つ目の引数は初期フォルダを指定するようになっています。
コード: 全て選択
Const BFFM_INITIALIZED = 1
Const BFFM_SETSELECTIONA = WM_USER + 102
Const BFFM_SETSELECTION = BFFM_SETSELECTIONA
Function BrowseCallbackProc(hwnd As HWND, msg As DWord, lp As LPARAM, lpData As LPARAM) As LRESULT
If msg = BFFM_INITIALIZED Then
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData) 'lpDataにはbi.lParamの内容(つまり初期フォルダへのポインタ)が入っている。
End If
End Function
Typedef PIDLIST = VoidPtr
Function OpenFolder(hWnd As HWND, InitialFolder As BytePtr) As String
Dim bi As BROWSEINFO
Dim pidlBrowse As VoidPtr
'BROWSEINFO構造体の初期化
FillMemory(VarPtr(bi), Len(bi), 0)
With bi
.hwndOwner=hWnd
.lpszTitle = "フォルダの選択"
.ulFlags = BIF_RETURNONLYFSDIRS or BIF_EDITBOX
.lParam = InitialFolder As LPARAM
.lpfn = AddressOf(BrowseCallbackProc)
End With
'「フォルダの参照」ダイアログボックスを表示
pidlBrowse = SHBrowseForFolder(bi) As PIDLIST
If pidlBrowse Then
'フォルダへのパスを取得
Dim folder[ELM(MAX_PATH)] As Byte
SHGetPathFromIDList(pidlBrowse, folder)
OpenFolder = folder
Else
OpenFolder = ""
End If
End Function
BrowseCallbackProcがそのコールバック関数です。
ちなみにコールバック関数のhwndはもちろんフォルダ選択ダイアログのウィンドウハンドルです。