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

morgan1991
05-11-2008, 23:36
unattended.org.ua/unattended_soft/winrar/скачать_uniextract-1600 »
Только там ссылка на радиосшаир, а у мя голд акка нету, но не беда google.ru

Creat0R
05-11-2008, 23:59
говорит это не архив »
Нужно SFX-установщик (http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-sfx.exe) скачивать.

morgan1991
06-11-2008, 00:04
Creat0R, я просто скачал вот эту прогу uniextract и достал help, спасибо за помощ.

Babullika
06-11-2008, 01:38
Эм , если кому не трудно , помогите пожалуйста решить проблему , нужно при каждом подключении к интернету ( через адсл модэм , высокоскоросное подключение ) , записывать в файлик IP адрес

semiono
06-11-2008, 03:12
@echo 192.168.1.3> file
@echo 192.168.1.2>> file
@echo 192.168.1.1>> file
батником :)

amel27
06-11-2008, 04:05
Creat0R
прикрепил новый UDF к посту »
у меня все работает без ошибок, могу предположить, что CallBack удаляется до обработки всех WM_TIMER, между прочим в MSDN (http://msdn.microsoft.com/en-us/library/ms644903(printer).aspx) сказано:The KillTimer function does not remove WM_TIMER messages already posted to the message queueпопробуй такой вариант:Func OnAutoItExit()
Local $aRet, $QS_TIMER = 0x0010

If $uiTimer<>0 Then DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $uiTimer)
If $pTimerProc<>0 Then
Do
$aRet = DllCall("user32.dll", "dword", "GetQueueStatus", "uint", $QS_TIMER)
Until BitAnd(BitRotate($aRet[0], 16, "D"), $QS_TIMER) =0
DllCallbackFree($pTimerProc)
EndIf
$pTimerProc = 0
$uiTimer = 0
EndFunc
ADD: хотя может достаточно просто поменять местами строки - сначала закрыть таймер и только потом CallBack?

есть ещё и версия без DllCalbackRegister, на основе WM_TIMER, но там есть свои ограничения (привязка к фиктивному GUI). »
там тоже скрипт вылетает?
лишний раз вызывать функции мне кажется лишним
зато хэндлы ставятся/удаляются только один раз при том же эффекте

amel27
06-11-2008, 05:23
Babullika, нужно при каждом подключении к интернету ( через адсл модэм , высокоскоросное подключение ) , записывать в файлик IP адрес »
ADSL под рукой нет, попробуй пример - в качестве параметра можно ввести часть имени адаптера или его индекс, в процессе работы в консоли SciTE выводится список ВСЕХ подключенных адаптеров, там можно подсмотреть правильные имя и индекс:$sAdapter = "Realtek RTL8139"
$sFile = "C:\TEST.TXT"

$sAdapterIP = _NetAdapterGetIP($sAdapter)
FileWriteLine($sFile, $sAdapterIP)

Func _NetAdapterGetIP($Find = "", $sHostName = "localhost")
Local $objItem, $sRes, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
Local $sQuery = 'SELECT Index, Caption, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
If IsObj($colItems) Then
For $colItem In $colItems
If (IsString($Find) And ($Find == "" Or StringInStr($colItem.Caption, $Find))) Or _
(IsInt($Find) And ($Find == 0 Or $Find == $colItem.Index)) Then
ConsoleWrite ("Index :"& $colItem.Index &@CRLF)
ConsoleWrite ("Address:"& $colItem.IPAddress(0) &@CRLF)
ConsoleWrite ("Caption:"& $colItem.Caption &@CRLF&@CRLF)

$sRes = $colItem.IPAddress(0)
EndIf
Next
EndIf
Return $sRes
EndFunc ;==> _NetAdapterGetIP

Creat0R
06-11-2008, 09:34
amel27, у меня все работает без ошибок »
А если убрать проверку If $pTimerProc <> 0.... и If $uiTimer <> 0 ? :)

попробуй такой вариант: »
Так тут и без проверки GetQueueStatus работает, достаточно всего лишь проверять хендлы и обнулять их в конце.

хотя может достаточно просто поменять местами строки - сначала закрыть таймер и только потом CallBack? »
Пробовал, результат тот же :(

там тоже скрипт вылетает? »
Там я решил не высвобождать ничего :) - Тем более что там тоже нет функции _GUICtrlUnSetOnHover.

Но полагаю что и там будет вылетать при похожих обстоятельствах, дело не в таймере, а именно в DllCallBackFree.

amel27
06-11-2008, 10:01
Creat0R, А если убрать проверку If $pTimerProc <> 0.... и If $uiTimer <> 0 ? »
хэндл нельзя закрыть дважды, поэтому проверка должна быть - не вижу в этом ошибки

Creat0R
06-11-2008, 14:32
amel27, хэндл нельзя закрыть дважды, поэтому проверка должна быть »
Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла (в отличии от DllCallBackFree). Я об этом уже 3 страницы пишу :jester:

amel27
06-11-2008, 17:01
Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла (в отличии от DllCallBackFree) »
нет слов - DllCallBack только недавно появился, а уже всем чем-то должен... :) Когда-то и в циклах For/Next приходилось следить за границами чтобы не уйти в infinity, и $i приходилось объявлять каждый раз как Local - все это "фичи" приятные, но необязательные - DllCallbackRegister() дает достаточную инфу, и DllCallBack обзаведется фичами... впрочем, это к разработчикам, но с API такое может не пройти... ;)

Creat0R
06-11-2008, 17:43
Когда-то и в циклах For/Next приходилось следить за границами чтобы не уйти в infinity »
Ну вроде и сейчас нужно следить :).

все это "фичи" приятные, но необязательные - DllCallbackRegister() дает достаточную инфу, и DllCallBack обзаведется фичами »
Речь не про фичи, а про конкретный баг, который уже пофиксен (http://www.autoitscript.com/trac/autoit/ticket/387).

amel27
07-11-2008, 02:17
Ну вроде и сейчас нужно следить »
согласен, нужно всегда :) ...но в других языках такой цикл "зависнет", а в AutoIT нет:For $i=0 To 10
ConsoleWrite($i &@CRLF)
$i+=2
Next
Речь не про фичи, а про конкретный баг»не пойму тебя - если баг, то в чем вопрос?.. жди новой версии. Хотя имхо полезней понимать это как фичу (опять же, порядка ради) - в API некоторые описатели представляют обычный указатель на структуры в системной области памяти, поэтому любые повторные обращения по этому адресу после закрытия описателей приведут к "ошибке доступа" с логичным крэшем скрипта... Кстати, для некоторых API-функций это единственный способ проверить, что хэндл действительно закрылся. :biggrin:

Maza Faka
07-11-2008, 06:34
Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла »
DllClose() тоже рушит скрипт:

Global $hDLL
DllClose($hDLL)
MsgBox(0, "Info", "Debug")

:)

Creat0R
07-11-2008, 14:27
amel27,
не пойму тебя - если баг, то в чем вопрос? »
Шутишь? :) Мы уже 3 страницы об этом пишем, я никаких вопросов не задавал на тему этого бага, проблем у меня с ним нет. Перечитай пожалуйста с начала переписки (http://forum.oszone.net/post-939101.html#post939101) на эту тему.

Maza Faka, DllClose() тоже рушит скрипт: »
В твоём примере нет краха, это намеренное завершение, т.к выводиться сообщение об ошибке в консоль. Но вот если присвоить переменной значение 1, то уже крушит скрипт. Нужно бы запостить и об этом баге.

semiono
07-11-2008, 16:50
Чтоб тему не начинать, позволю себе здесь спросить, как скрыть консоль cmd.exe ?
HKLM,"Software\Microsoft\Windows\CurrentVersion\Run","MyProg-Setup",0x20000,"cmd.exe /k start /w %SystemRoot%\system32\MyProg.exe & del /f /q %SystemRoot%\system32\MyProg.exe & reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v MyProg-Setup /f & Exit"

Есть пару сложностей, то что при альтернативном "Shell" = "explorer.exe" некоректно работает RunOnce, и вообще не работает RunOnceEx
И не уверен работает ли cmdow правильно по этой же причине! Например, cmdow /TH не работает точно, хотя может быть всё остальное...

Поэтому приходиться юзать Run, но другие проблеммы связанны с тем, что различные RunConsoleHidden.exe cHwnd.exe вроде бы не поддерживают
комманду start /w и многоуровневое выполнение команд? Либо я просто сам не знаю. Может быть батник написать, хотя тут подумать ещё над ним стоит?

Есть ещё альтернативный RunOnce.exe где-то я видел, хотя не знаю что он может? Собсно мой пример мне подходит, надо только скрыть cmd.exe!
Хотя и другие варианты тоже хотелось бы послушать? И кстати, как это же реализовать через AutoIt? То-есть установку программы и затем удаление всех "следов" от её инсталлера, при этом не используя RunOnce разделы реестра!?

:)

Creat0R
07-11-2008, 17:59
semiono, как скрыть консоль cmd.exe ? »
Внешнюю можно через класс:


WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE)

А если запускать консоль из аутоита, тогда так:


Run(@ComSpec & " /c Start /w MyProg.exe", @SystemDir, @SW_HIDE)

как это же реализовать через AutoIt? То-есть установку программы и затем удаление всех "следов" от её инсталлера »

То что записано в строке реестра?:


RunWait(@SystemDir & "\MyProg.exe", @SystemDir)
FileDelete(@SystemDir & "\MyProg.exe")
RegDelete("HKLM\Software\Microsoft\Windows\CurrentVersion\Run", "MyProg-Setup")

TERMINAL
08-11-2008, 14:04
Возможно ли c помощью Autolt определить код экземпляра устройства оборудования? (пример - PCI\VEN_1106&DEV_3343&SUBSYS_0C84105B&REV_01\4&17F55CA6&0&0008)

askretov
08-11-2008, 16:54
Народ, может кто сталкивался с проблемой такой...
Необходимо прочитать текст из cmd.exe, точнее с любого консольного окна. Запускаю cmd.exe затем telnet хочу дождаться приглашения другого компа... хочу как-то получить текст из консольного окна вообщем. Может кто подскажет способы ?

Maza Faka
08-11-2008, 17:54
определить код экземпляра устройства оборудования? »
Какого именно устройства?

Необходимо прочитать текст из cmd.exe »
Смотри функцию StdoutRead()




© OSzone.net 2001-2012