Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Creat0R

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() для получения указателя, и далее использовать его при вызове заполнении структуры .

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 09:13, 04-01-2008 | #928