Must AutoIt
Сообщения: 3054
Благодарности: 1009
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Цитата Creat0R:
Не удаётся в новой версии AutoIt 3.2.10.0 переделать самопальную функцию _FileSelectFolder() »
|
Удалось!
Код: 
Func _FileSelectFolder($sText='', $iRoot=0, $iFlags=0, $sInitDir=@ScriptDir, $hWnd=0, $sCallbackProc='_FileSFCallbackProc')
Local $pidl, $iRes='', $pCallbackProc=0, $iMask = $BIF_ALLOLDSTYLEFLAGS, $Error = 0
; Контроль входных параметров
;$sInitDir = StringRegExpReplace($sInitDir, '([^\\])\\*$', '\1\\')
;If StringRight($sInitDir, 1)=':' Then $sInitDir &= '\'
If BitAND($iFlags, $BIF_NEWDIALOGSTYLE) Then $iMask = $BIF_ALLNEWSTYLEFLAGS
; Создание и инициализация основных структур данных
Local $uBI = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; BROWSEINFO
Local $uTX = DllStructCreate ("char[260];char") ; Текст приглашения
Local $uMP = DllStructCreate ("char[260]") ; MAX_PATH
Local $uCB = DllStructCreate ("char[260];int") ; CallBack структура
DllStructSetData ($uTX, 1, $sText)
DllStructSetData ($uCB, 1, $sInitDir)
DllStructSetData ($uCB, 2, $iFlags)
; Заполнение структуры BROWSEINFO
DllStructSetData ($uBI, 1, $hwnd)
DllStructSetData ($uBI, 3, DllStructGetPtr($uMP))
DllStructSetData ($uBI, 4, DllStructGetPtr($uTX))
DllStructSetData ($uBI, 5, BitAND($iFlags, $iMask))
DllStructSetData ($uBI, 7, DllStructGetPtr($uCB))
; Получение указателя на CallBack-функцию
If $sCallbackProc <> '' Then $pCallbackProc = DllCallbackRegister($sCallbackProc, 'int', 'hwnd;int;long;ptr')
If @error Then Return SetError(2, @error, '') ; ОШИБКА получения указателя
DllStructSetData($uBI, 6, DllCallbackGetPtr($pCallbackProc))
; Получение указателя на корневую папку (PIDL)
Local $iRet = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
"int", 0 , "int", $iRoot , "ptr", DllStructGetPtr($uBI, 2))
If $iRet[0]=0 Then
; Запуск системного диалога
$pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr($uBI))
$iRes = DllStructGetData($uMP, 1) ; сохраняем имя объекта
If $pidl[0] Then
; Обработка полученного указателя (PIDL)
$iRet = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pidl[0], "ptr", DllStructGetPtr($uMP))
If $iRet[0] Then $iRes = DllStructGetData($uMP, 1)
DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; чистим за собой
Else
$Error = 1
EndIf
DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($uBI, 2)) ; чистим за собой
Else
SetError(1, 0, '') ; ОШИБКА в параметре корневой папки
EndIf
If $pCallbackProc Then DllCallBackFree($pCallbackProc) ; закрытие указателя
Return SetError($Error, 0, $iRes)
EndFunc
Оказывается DllCallbackRegister() возвращает не указатель, а идентификатор, нужно было всего лишь использовать DllCallbackGetPtr() для получения указателя, и далее использовать его при вызове заполнении структуры  .
|