Here is a full example in plain Masm32.
include \masm32\include\masm32rt.inc
.data?
buffer db MAX_PATH dup(?)
.code
Browse4Folder proc pCaption
LOCAL bInfo:BROWSEINFO, initialPath[MAX_PATH]:BYTE
mov eax, ebp
.Repeat
sub eax, 4
and dword ptr [eax], 0 ; clear the locals
.Until eax<=esp
push
esi push
edi mov
edi, offset buffer
mov bInfo.pszDisplayName,
edi m2m bInfo.lpszTitle, pCaption
mov bInfo.lpfn,
cbSHB ; callback, credits to Tedd lea esi, initialPath
mov bInfo.lParam, esi
invoke GetCurrentDirectory, MAX_PATH, esi
invoke SHBrowseForFolder, addr bInfo
.if eax
invoke SHGetPathFromIDList, eax,
edi xchg eax,
edi .endif
pop
edi pop
esi ret
Browse4Folder endp
cbSHB proc hwnd:HWND, uMsg:UINT, lParam:LPARAM, lpData:LPARAM
.if uMsg==BFFM_INITIALIZED
invoke SendMessage, hwnd, BFFM_SETSELECTION, TRUE, lpData
.endif
ret
cbSHB endp
start:
invoke Browse4Folder,
chr$("Select a folder")
.if eax
MsgBox 0, eax, "Selected folder:", MB_OK
.else
MsgBox 0, "You cancelled", "Selected folder:", MB_OK
.endif
exitend start
EDIT: Version 2 attached - the clear locals loop was one off.