можно примерчик?... "на слух" сложно воспринять
Код:

Func _MyFSFCallbackProc ($hWnd, $iMsg, $wParam, $lParam)
Local $uCB = DllStructCreate ("char[260];int", $lParam)
Switch $iMsg
Case $BFFM_INITIALIZED
DllCall ("user32.dll","int","SendMessage", _
"hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB))
Case $BFFM_SELCHANGED
Local $pIDL=_IDLGetLast($wParam) ; Переход к последнему элементу списка
; Условие на допустимые для выбора типы объектов
If _IDLIsFolder($pIDL) Then
DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",1)
Else
DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",0)
EndIf
EndSwitch
EndFunc ;==> _MyFSFCallbackProc
; Рекурсивная функция перехода к последнему объекту списка IDL
Func _IDLGetLast($pIDL)
Local $u1 = DllStructCreate("ushort", $pIDL)
Local $u2 = DllStructCreate("ushort", $pIDL + DllStructGetData($u1,1))
If (DllStructGetData($u1,1) And DllStructGetData($u2,1)) Then Return _IDLGetLast(DllStructGetPtr($u2))
Return $pIDL
EndFunc
; Возврат типа объекта по его PIDL
Func _IDLGetType($pIDL)
Local $u = DllStructCreate("ushort;byte", $pIDL)
Return DllStructGetData($u,2)
EndFunc
; Возврат размера IDL Data
Func _IDLGetSize($pIDL)
Local $u = DllStructCreate("ushort", $pIDL)
Return DllStructGetData($u,1)
EndFunc
; Проверка: является ли объект диском
Func _IDLIsDrive($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType=0x23 Or $iType=0x25 Or $iType=0x29 Or $iType=0x2F)
EndFunc
; Проверка: входит ли буква диска в строку
Func _IDLIsDriveIn($pIDL, $sDrv)
Local $u = DllStructCreate("ushort;byte;char", $pIDL)
If _IDLIsDrive($pIDL) Then Return $pIDL And StringInStr($sDrv, DllStructGetData($u,3),2)
Return 0
EndFunc
; Проверка: является ли объектом файл
Func _IDLIsFile($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType = 0x32 Or $iType = 0x34)
EndFunc
; Проверка: является ли объектом каталог
Func _IDLIsFolder($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And ($iType = 0x30 Or $iType = 0x31)
EndFunc
; Проверка: является ли объектом компьютер
Func _IDLIsComputer($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And $iType=0x42
EndFunc
; Проверка: является ли объектом сетевой ресурс
Func _IDLIsShare($pIDL)
Local $iType = _IDLGetType($pIDL)
Return $pIDL And $iType=0xC3
EndFunc
; Проверка: является ли объектом "Рабочий стол"
Func _IDLIsDesktop($pIDL)
Local $iSize = _IDLGetSize($pIDL)
Return Not($pIDL And $iSize)
EndFunc
; Проверка: является ли объектом "Мой компьютер"
Func _IDLIsMyComputer($pIDL)
Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xE04FD020EA3A6910A2D808002B30309D'
EndFunc
; Проверка: является ли объектом папка "Мои документы"
Func _IDLIsMyDocuments($pIDL)
Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xBA8F0D4525ADD01198A80800361B1103'
EndFunc
; Проверка на соответствие регулярному выражению (только для файлов/каталогов)
Func _IDLPathRegExp($pIDL, $sRegExp)
Local $ret, $res=0, $buf = DllStructCreate("char[260]")
If $pIDL Then
$ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pIDL, "ptr", DllStructGetPtr($buf))
If $ret[0] Then $res = StringRegExp(DllStructGetData($buf,1),$sRegExp)
EndIf
Return $res
EndFunc