PDA

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [53] 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

Creat0R
31-10-2008, 12:43
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)

Creat0R
31-10-2008, 18:30
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 с неправильным хендлом).

amel27
01-11-2008, 03:22
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

:)

amel27
01-11-2008, 14:45
Пока нет релиза новой версии, с этой напастью борюсь так »
Maza Faka, Creat0R, не пойму о чем вы?.. Если скрипт пишу я, то мне очень даже известно в каком месте какой хэндл открыт - достаточно добавить проверку на ошибки.

Другое дело, если логика скрипта включает много ветвлений типа IF/ELSE, то код закрытия описателей придется дублировать не один раз - для каждого благоприятного исхода их открытия, а это раздувает текст скрипта повторяющимися строчками - прямо как с примером про дискету :) ...Вот и приходится вводить вспомогательные "флаги", которые проверяются уже при выходе из UDF или скрипта. Проверка IsDeclared() имхо тоже не решение, так как все переменные обычно определяют еще в заголовке скрипта/UDF.

Как уже было озвучено выше - эта проблема актуальна прежде всего для API, а интеллектом AutoIT по чистке "своего" мусора ИМХО не стоит пренебрегать - особенно если при этом скрипт становится существенно короче и читабельней. ;)

Creat0R
01-11-2008, 15:54
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. Придётся обращаться к автору и просить исходники :)

amel27
02-11-2008, 10:08
Creat0R
иногда скрипт требует динамичного создания и освобождения хендлов »
если несложно, можно пример?.. или линк

Creat0R
02-11-2008, 13:27
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 убрали какие то необходимые библиотеки или типа того

amel27
03-11-2008, 10:11
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 контрола?.. впрочем, это уже будет совсем другая функция :)

Creat0R
03-11-2008, 13:38
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 не поможет.

Busel
03-11-2008, 13:54
Как создать 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