Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
amel27,
Те что открыты через API обязательно, через ф-ции AutoIT необязательно »
Т.е DllCallBackRegister() не обязательно освобождать? у меня просто есть несколько UDF'ов, в них я использую функцию OnAutoItExit для высвобождения хендлов (от DllCallBackRegister и от таймера), и по ясным причинам, позже эта функция может вовсе не вызываться (пользователь задаст другую). Вот мне и стало интересно, чем я рискую убрав совсем эту функцию, не закрывая ничего.
Maza Faka
31-10-2008, 16:03
Creat0R
В бета версии этот баг исправлен (http://www.autoitscript.com/forum/index.php?showtopic=76332&view=findpost&p=552984)
Maza Faka,
В бета версии этот баг исправлен (http://www.autoitscript.com/forum/index.php?showtopic=76332&view=findpost&p=552984)
А я не говорю про баг :) - И, кстати, это я зарепортил об этом баге (http://www.autoitscript.com/trac/autoit/ticket/387) ;), хотя я скорее зарепортил это как Feature Request, чтобы хендл очищался (если речь про крах при использоваии DllCallbackFree с неправильным хендлом).
Creat0R
DllCallBackRegister() не обязательно освобождать?»думаю необязательно, хотя желательно... порядка ради :)
от DllCallBackRegister и от таймера »не путай одно с другим - если таймер вызывается через API, то нужно следовать требованиям MSDN, а там сказано:Applications should use the KillTimer function to destroy timers that are no longer necessary.
Maza Faka
01-11-2008, 07:16
А я не говорю про баг »
Да, это не баг, но всё же сильно раздражает, ведь при использовании функции FileClose() с неверным handle в качестве параметра, аварийного завершения скрипта не происходит. Пока нет релиза новой версии, с этой напастью борюсь так:
If IsDeclared("ProcHandle") Then
If $ProcHandle <> 0 Then DllCallbackFree($ProcHandle)
EndIf
:)
Пока нет релиза новой версии, с этой напастью борюсь так »
Maza Faka, Creat0R, не пойму о чем вы?.. Если скрипт пишу я, то мне очень даже известно в каком месте какой хэндл открыт - достаточно добавить проверку на ошибки.
Другое дело, если логика скрипта включает много ветвлений типа IF/ELSE, то код закрытия описателей придется дублировать не один раз - для каждого благоприятного исхода их открытия, а это раздувает текст скрипта повторяющимися строчками - прямо как с примером про дискету :) ...Вот и приходится вводить вспомогательные "флаги", которые проверяются уже при выходе из UDF или скрипта. Проверка IsDeclared() имхо тоже не решение, так как все переменные обычно определяют еще в заголовке скрипта/UDF.
Как уже было озвучено выше - эта проблема актуальна прежде всего для API, а интеллектом AutoIT по чистке "своего" мусора ИМХО не стоит пренебрегать - особенно если при этом скрипт становится существенно короче и читабельней. ;)
Maza Faka,
Да, это не баг »
Ты меня немного не так понял. Я не говорил что есть или нету бага (хотя он есть), я вовсе не об этом писал, я просто хотел узнать нужно ли освобождать хендлы, и amel27 довольно исчерпывающе ответил :)
Пока нет релиза новой версии, с этой напастью борюсь так »
Я предпочитаю ещё и переменную обнулировать, см. мой репорт (http://www.autoitscript.com/trac/autoit/ticket/387).
amel27,
Если скрипт пишу я, то мне очень даже известно в каком месте какой хэндл открыт - достаточно добавить проверку на ошибки. »
Да, но иногда скрипт требует динамичного создания и освобождения хендлов, тут могут возникнуть проблемы (именно так я и наткнулся на эту проблему).
Кроме прочего, я считаю что скрипт не должен “вылетать” из за передачи неправильного (уже освобожденного) хендла в функцию, функция сама должна уметь распознать хендл и, если он неправильный, возвращать/устанавливать код ошибки.
Maza Faka
01-11-2008, 16:08
Creat0R
amel27
OK! :)
D_Master
01-11-2008, 16:22
эммм... такой вопрос - есть ли возможность раскомпилировать exe'шник, написанный на AutoIt'e?
Maza Faka
01-11-2008, 17:00
есть ли возможность раскомпилировать exe'шник, написанный на AutoIt'e? »
Штатной AutoIt утилитой Exe2Aut.exe, только скрипты версии 3.2.5.1 и ранее. А нештатными утилитами - это из области хакинга/дебагинга :)
D_Master
01-11-2008, 17:25
Maza Faka, спасибо, но exe-шники, к сожалению, оказались версии 3.2.12.1. Придётся обращаться к автору и просить исходники :)
Creat0R
иногда скрипт требует динамичного создания и освобождения хендлов »
если несложно, можно пример?.. или линк
amel27, можно пример?.. или линк »
Ну к примеру мой GUICtrlSetOnHover UDF (http://www.autoitscript.com/forum/index.php?showtopic=55120). Там при каждом вызове функции GUICtrlSetOnHover() проверяется не установлен ли уже CallBack, также при вызове GUICtrlUnSetOnHover() высвобождается CallBack и таймер (если это последний элемент в массиве). Вот там могут возникнуть проблемы. Также юзер может вызвать функцию OnAutoItExit() предварительно, таким образом будет высвобождён CallBack (и если проверки не будет, то повторный вызов приведёт к краху скрипта).
P.S
Это только один пример, есть ещё пару (точно где не помню), где дела обстоят ещё хуже.
Babullika
02-11-2008, 18:40
При использовании
AutoItSetOption("TrayIconDebug", 1)
на ПК все норм работает а на буке нет строки... в чем может быть проблема ?
Maza Faka
03-11-2008, 06:20
Babullika
Какая ОС на ПК и буке?
Babullika
03-11-2008, 09:57
на ПК XP Pro sp3 ( Zver CD ) , на буке XP Pro SP3 из MicroXP v0.8 , видимо из образа микро xp убрали какие то необходимые библиотеки или типа того
Creat0R
Во-первых, в твоем примере нет динамического создания/удаления описателей - тут речь всего о двух хэндлах, а точнее - об одной группе связанных описателей: (CallBack + Timer), которую можно обозвать одним "составным описателем". Во-вторых, я не вижу проблемы как таковой - определи пару UDF: одна создает описатель, другая - закрывает и пусть пользователь сам решает куда их втыкать. ;)
Могу предложить свой вариант системы UDF, причем без создания глобальных данных:
_GUICtrlOnHoverCallOpen() - открывает хэндлы, инициализирует и возвращает массив - управляющую структуру, в которой сохраняются хэндлы и рабочие данные, пример заполнения:
$aControl [0] [0] - кол-во элементов массива (обрабатываемых контролов)
$aControl [0] [1] - описатель CallBack
$aControl [0] [2] - описатель Timer
$aControl [$i] [0] - ControlID
$aControl [$i] [1] - HoverFuncName
$aControl [$i] [2] - HoverFuncNameLeave
_GUICtrlOnHoverCallClose(ByRef $aControl) - закрывает все описатели и уничтожает управляющий массив ($aControl =0)
_GUICtrlOnHoverCallAdd(ByRef $aControl, $CtrlID, $HoverFuncName = "", $HoverFuncNameLeave = "") - регистрирует контрол для обработки
_GUICtrlOnHoverCallDelete(ByRef $aControl, $CtrlID) - снимает контрол с обработки
есть ещё пару (точно где не помню), где дела обстоят ещё хуже »вспоминай ;)
ADD: может я ошибаюсь, но имхо для штатного GUI не нужен никакой таймер - достаточно поставить обработчик сообщения WM_MOUSEMOVE ...совсем другое дело обработка контролов чужих окон, но там одного ControlID недостаточно, нужно еще идентифицировать главное окно или процесс... а может просто передавать hWnd контрола?.. впрочем, это уже будет совсем другая функция :)
amel27,
в твоем примере нет динамического создания/удаления описателей »
Есть, ты видимо не ту версию скачал (нужно ту что для 3.2.10.0) :) - Ведь если вызывать функции постоянно это уже и будет динамический...
Например:
#include <GuiConstants.au3>
#include <GUICtrlSetOnHover_UDF_For 3.2.10.0.au3>
$GUI = GUICreate("Test Script", 300, 200)
$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)
For $i = 1 To 10
If Mod($i, 2) = 0 Then
_GUICtrlSetOnHover($Button, "Hover_Func", "Leave_Hover_Func")
Else
_GUICtrlUnSetOnHover($Button)
EndIf
Next
GUISetState(@SW_SHOW, $GUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
В этом случае, если не проверять If $pTimerProc <> 0 в UDF, то скрипт вылетает.
не вижу проблемы как таковой »
Я проблему то решил для себя, но по большому проблема есть, и заключается она в том, что Аутоит "вылетает" когда от него это не ожидается.
Могу предложить свой вариант системы UDF, причем без создания глобальных данных »
Хм, у тебя получается сделать без глобальных переменных? А как быть с LAST_HOVERED_ELEMENT? т.е нужно чтобы функция не вызывалась всё время, а только при навидении в первый раз.
для штатного GUI не нужен никакой таймер - достаточно поставить обработчик сообщения WM_MOUSEMOVE »
Имхо, этого не будет достаточно если нужно чтобы обработка OnHover была и при не активном GUI, а также в последних версиях UDF добавлена возможность OnClick ($sPrimaryDownFuncName, $sPrimaryUpFuncName), там явно MouseMove не поможет.
Как создать Shortcut c параметром - "Setup.exe" -uninstall? Функция FileCreateShortcut создает в кавычках, а нужен параметр без кавычек. Или только батник писать и на него Shortcut?
Babullika
03-11-2008, 14:33
Добрый день
Дайте совет пожалусто
Юзаю такую щтуку
FileCopy("C:\Temp2\*.txt", "C:\Temp3\" & Random(-10, 10, 1) & "*.txt", 9)
получается что все файлы копируются с одинаковыми префиксами , а как сделать чтобы у каждого файла префикс разный был ?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.