Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
DenchikK
01-06-2007, 13:09
Creat0R
Суть работы скрипта такова:
Заливка файлов по списку ссылок в аккаунты, доступ к которым задается логином и паролем.
То есть со стороны юзеа это выглядит так: он подготоавливает список ссылок на файлы, которые хочет скачать, и список пустых аккаунтов, в которые эти ссылки будут помещены. 1 линк = 1 аккаунт. При запуске скрипта юзер выбирает, в какой именно аккаунт будет заливаться любой по списку файл по линку (radibutton подходит лучше, но я что то до сих пор с опреатором case из примера не разобрался):
http://img154.imageshack.us/img154/3923/1autowa8.jpg
И вот когда выбран нужный аккаунт, поле самой программы заполняется:
http://img154.imageshack.us/img154/8333/2autoyc1.jpg
В поле линк - идет ссылка, тут наверное даже не принципиально её положение в файле, пускай будет самая первая в списке (ещё б сделать в этом случае её удаление из списка, после заполнения поля)
В поле Логин - тот Логин, что выбран, в поле Пароль - соответствующий ему пароль . Например 6 логин сверху соответствует 6 сверху паролю (то же былоб интереснее, чтоб после заполнения они бы стирались).
Вообщем как то так...
Спасибо Вам что Вы со мною возитесь! :-)
Проблема, при отработке скрипта. Ставлю прогу (http://www.altrixsoft.com/en/hddinsp/) , кто может объясните почему нажатие кнопок не срабатывает. В предыдущем посте мне объяснили в чем проблема. Но не помогает.
#cs
----------------------
----------------------
#ce
;предотвращение возможности множественного запуска скрипта
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)
; Установка переменных
Global $file='hddinsp.exe', $ACStr
Run ( $file )
WinWaitActive ( 'Installer Language', 'Please select a language.' )
ControlClick ( 'Installer Language', 'Please select a language.', 'Button1' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Мастер установки Hard Drive Inspector Professional' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Мастер установки Hard Drive Inspector Professional', 'Button2' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Лицензионное соглашение' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Лицензионное соглашение', 'Button4' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Лицензионное соглашение' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Лицензионное соглашение', 'Button2' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Выбор папки установки' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Выбор папки установки', 'Button2' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Папка в меню "Пуск"' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Папка в меню "Пуск"', 'Button2' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Установка завершена' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Установка завершена', 'Button2' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Завершение работы мастера установки' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Завершение работы мастера установки', 'Button4' )
WinWaitActive ( 'Установка Hard Drive Inspector Professional', 'Завершение работы мастера установки' )
ControlClick ( 'Установка Hard Drive Inspector Professional', 'Завершение работы мастера установки', 'Button2' )
exit
Сразу недосмотрел. Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe, т.е. ничем не отличается от работы со скриптом au3. Самостоятельно НЕ запускается - сразу же требует исходный exe. Декомпилировал его с помощью Exe2Aut и увидел, что в него один к одному переписан скрипт и больше ничего нет, хотя объём около 200 KB.
Интересный момент: видимое содержимое декомпилированного exe с одинаковыми именами (который вообще не запускается) абсолютно аналогично описанному выше (это просто текст скрипта), и объёмы у них одинаковы.
Где ещё копать?
voler
Ставлю прогу , кто может объясните почему нажатие кнопок не срабатывает.
Проверил несколько кнопок - работает, но только тогда, когда окно активно...
Я бы заменил WinWaitActive на WinWait(), поскольку ControlClick() умеет работать даже с неактивными окнами, и вполне достаточно просто дождаться появления окна.
DenchikK
Попробую переформулировать (для проверки, правильно ли я понял):
Запускаем скрипт, создаются столько чекбоксов, сколько есть записей в файле линков (и только для этих записей создаём чекбоксы)...
а точнее (как я понял), создаём radio button ;)
Далее после нажатия на Старт, в каждое поле вписывается соответственно - Ссылка, логин, и пароль.
Вот только есть одна проблема - какое должно быть название у чекбоксов? можно совместить что то вроде этого:
Login_pass_link (как у тебя на скрине)... и потом разделять это на три значения, для того чтобы выявить нужные данные для записи в прогу.
Такой вопрос:
А списки обязательно держать в трёх разных файлах? может можно записывать в один ini файл (к примеру AvaRemote.ini), чтобы имя секции ровнялось ссылке, а под секцией записи пароля и логина, что то типа такого:
[http://mail.ru]
loging1=DenchikK
pass1=12345
login2=DenchikK
pass2=54321
и т.д
Так будет намного эргономичнее и удобнее обрабатывать данные.
Работать с Radio button совсем не сложно, почти также как и с обычными чекбоксами, разница только в том что может быть выбран один пункт в определённой группе (при наличии таковой).
Вот пример:
GUICreate("test")
$Radio1 = GUICtrlCreateRadio("Radio1", 10, 40)
$Radio2 = GUICtrlCreateRadio("Radio2", 10, 70)
$Radio3 = GUICtrlCreateRadio("Radio3", 10, 100)
$ShowSelectedButton = GUICtrlCreateButton("Show checked button", 150, 200)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $ShowSelectedButton
Select
Case GUICtrlRead($Radio1) = 1
MsgBox(0, "", "This radio button checked: " & GUICtrlRead($Radio1, 1))
Case GUICtrlRead($Radio2) = 1
MsgBox(0, "", "This radio button checked: " & GUICtrlRead($Radio2, 1))
Case GUICtrlRead($Radio3) = 1
MsgBox(0, "", "This radio button checked: " & GUICtrlRead($Radio3, 1))
EndSelect
EndSwitch
WEnd
ChVL
Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe
Это напряму зависит от того, какой состав скрипта, возможно в скрипте используются данные читаемые при выполнении из самого скрипта :) - чтобы сказать более точно, необходимо видеть исходный код.
DenchikK
02-06-2007, 12:02
Creat0R
Запускаем скрипт, создаются столько чекбоксов, сколько есть записей в файле линков (и только для этих записей создаём чекбоксы)...
Почти так - только не линков, а логинов. :-)
Вот только есть одна проблема - какое должно быть название у чекбоксов?
Названия - как у логинов.
А списки обязательно держать в трёх разных файлах? может можно записывать в один ini файл (к примеру AvaRemote.ini)
Это было б вообще прекрасно! Я и не знал о такой возможности!
Работать с Radio button совсем не сложно, почти также как и с обычными чекбоксами
Спасибочки! Сейчас буду пробовать работать с Radio Button
Добавлено ещё раз :-)
C radiobutton кое как разобрался. С ini файлом вроде то же (спасибо огромное за подсказку его использовать! так стало гораздо удобнее ). Вот немного уменьшил скрипт, как смог:
#include <GUIConstants.au3>
#include <File.au3>
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("SendKeyDelay", 60)
AutoItSetOption("MouseCoordMode", 0)
Global $i, $file, $group_1, $group_2, $group_3, $Links_Array, $Logins_Array, $Pass_Array, $Servers_Array, $Secrets_Array
; Запуск программы
Run ('avaload.exe')
; Считывание Данных
$Logins_Array = IniReadSection("ava.ini", "logins")
$Pass_Array = IniReadSection("ava.ini", "pass")
$Links_Array = IniReadSection("ava.ini", "links")
$Servers_Array = IniReadSection("ava.ini", "servers")
$Secrets_Array = IniReadSection("ava.ini", "secrets")
; Построение GUI
GUICreate("Автозаполнение", 340, 350)
;If IsArray($Links_Array) Then
; $Top = 20
; For $i = 1 To Logins_Array[0][0]
; GUICtrlCreateRadio($Logins_Array[$i][1], 10, $Top)
; $Top += 20
; Next
;EndIf
$Radio1 = GUICtrlCreateRadio($Logins_Array[1][1], 10, 20)
$Radio2 = GUICtrlCreateRadio($Logins_Array[2][1], 10, 40)
$Radio3 = GUICtrlCreateRadio($Logins_Array[3][1], 10, 60)
$Radio4 = GUICtrlCreateRadio($Logins_Array[4][1], 10, 80)
$Radio5 = GUICtrlCreateRadio($Logins_Array[5][1], 10, 100)
$Radio6 = GUICtrlCreateRadio($Logins_Array[6][1], 10, 120)
$Radio7 = GUICtrlCreateRadio($Logins_Array[7][1], 10, 140)
$Radio8 = GUICtrlCreateRadio($Logins_Array[8][1], 10, 160)
$Radio9 = GUICtrlCreateRadio($Logins_Array[9][1], 10, 180)
$Radio10 = GUICtrlCreateRadio($Logins_Array[10][1], 10, 200)
$Radio11 = GUICtrlCreateRadio($Logins_Array[11][1], 10, 220)
$Radio12 = GUICtrlCreateRadio($Logins_Array[12][1], 10, 240)
$Radio13 = GUICtrlCreateRadio($Logins_Array[13][1], 10, 260)
$Radio14 = GUICtrlCreateRadio($Logins_Array[14][1], 10, 280)
$Radio15 = GUICtrlCreateRadio($Logins_Array[15][1], 10, 300)
$Radio16 = GUICtrlCreateRadio($Logins_Array[16][1], 10, 320)
$Start = GUICtrlCreateButton("Заполнить", 210, 20, 120, 20)
$Close = GUICtrlCreateButton("Выход", 210, 40, 120, 20)
$Server1 = GUICtrlCreateButton("Сервер 1", 210, 60, 120, 20)
$Server2 = GUICtrlCreateButton("Сервер 2", 210, 80, 120, 20)
$group_1 = GUICtrlCreateGroup ("Выбор Аккаунта", 5, 5, 190, 340)
$group_2 = GUICtrlCreateGroup ("Кнопочки", 205, 5, 130, 100)
$group_3 = GUICtrlCreateGroup ("Описание", 205, 105, 130, 240)
$Label1 = GUICtrlCreateLabel(" Описание Работы", 210, 120)
$Label2 = GUICtrlCreateLabel("1. Впишите в ava.ini", 210, 140)
$Label3 = GUICtrlCreateLabel("линки,логины,пароли,", 210, 155)
$Label4 = GUICtrlCreateLabel("параметры серверов.", 210, 170)
$Label5 = GUICtrlCreateLabel("2. Выберите Сервер", 210, 185)
$Label6 = GUICtrlCreateLabel("3. Выберите пустой ", 210, 200)
$Label7 = GUICtrlCreateLabel("аккаунт для заливки. ", 210, 215)
$Label8 = GUICtrlCreateLabel(" Принцип работы: ", 210, 235)
$Label9 = GUICtrlCreateLabel("Например, выбираем", 210, 250)
$Label10 = GUICtrlCreateLabel("первый логин,в него", 210, 265)
$Label11 = GUICtrlCreateLabel("будет заливаться ", 210, 280)
$Label12 = GUICtrlCreateLabel("первый линк. и.т.д", 210, 295)
$Label13 = GUICtrlCreateLabel(" Удачи! ", 210, 315)
GUISetState ()
; Основная Работа Скрипта
GUISetState() ; display the GUI
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $Close
Exit
Case $Server1
WinActivate ("AvaRemoteLoad")
ControlClick ( 'AvaRemoteLoad', '', "Button4")
WinWaitActive ('Настройки')
ControlSetText ( 'Настройки', '', 'Edit1', $Servers_Array[1][1])
ControlSetText ( 'Настройки', '', 'Edit2', $Secrets_Array[1][1])
ControlClick ( 'Настройки', '', "Button2")
Case $Server2
WinActivate ("AvaRemoteLoad")
ControlClick ( 'AvaRemoteLoad', '', "Button4")
WinWaitActive ('Настройки')
ControlSetText ( 'Настройки', '', 'Edit1', $Servers_Array[2][1])
ControlSetText ( 'Настройки', '', 'Edit2', $Secrets_Array[2][1])
ControlClick ( 'Настройки', '', "Button2")
Case $Start
Select
Case GUICtrlRead($Radio1) = 1
$i = 1
Case GUICtrlRead($Radio2) = 1
$i = 2
Case GUICtrlRead($Radio3) = 1
$i = 3
Case GUICtrlRead($Radio4) = 1
$i = 4
Case GUICtrlRead($Radio5) = 1
$i = 5
Case GUICtrlRead($Radio6) = 1
$i = 6
Case GUICtrlRead($Radio7) = 1
$i = 7
Case GUICtrlRead($Radio8) = 1
$i = 8
Case GUICtrlRead($Radio9) = 1
$i = 9
Case GUICtrlRead($Radio10) = 1
$i = 10
Case GUICtrlRead($Radio11) = 1
$i = 11
Case GUICtrlRead($Radio12) = 1
$i = 12
Case GUICtrlRead($Radio13) = 1
$i = 13
Case GUICtrlRead($Radio14) = 1
$i = 14
Case GUICtrlRead($Radio15) = 1
$i = 15
Case GUICtrlRead($Radio16) = 1
$i = 16
EndSelect
WinActivate ("AvaRemoteLoad")
ControlSetText ( 'AvaRemoteLoad', '', 'Edit1', $Links_Array[$i][1])
ControlSetText ( 'AvaRemoteLoad', '', 'Edit2', $Logins_Array[$i][1])
ControlSetText ( 'AvaRemoteLoad', '', 'Edit3', $Pass_Array[$i][1])
EndSwitch
WEnd
И вот тут у меня появляется такая затыка:
Для последующей обработки выбора radiobutton
Case GUICtrlRead($Radio1) = 1
$i = 1
пытался впихнуть строчку
If IsArray($Logins_Array) Then
$Top = 20
For $i = 1 To Logins_Array[0][0]
GUICtrlCreateRadio($Logins_Array[$i][1], 10, $Top)
$Radio[$i] = GUICtrlCreateRadio($Logins_Array[$i][1], 10, $Top)
$Top += 20
Next
EndIf
но не получилось, вываливается ошибка. Как сопоставить теперь автоматическое рисование нужного количества радиобутаннов и их работу - ума не приложу...
DiamondЯ бы заменил WinWaitActive на WinWait()+1
Почему-то был уверен, что поставил WinWait(), уже исправил...
V0van3к сожалению в данном случае не всё так просто. видимо вы не проверяли+1 :)
конечно не проверял, нынче найти 16-битное приложение не так просто... вот навскидку два варианта:
Простой и надежный способ ценой лишнего CMD-процесса:$exe = 'Vcmurbas.exe' ; Имя 16-битного приложения
$dir = 'C:\Program Files\Vcmurbas' ; Путь к каталогу программы
$pid = Run(@COMSPEC & ' /C START /WAIT /SEPARATE ' & $exe, $dir, @SW_HIDE)
While ProcessExists($pid)
Sleep(200)
WEnd
Более "навороченный", но без дополнительных процессов:$exe = 'Vcmurbas.exe' ; Имя 16-битного приложения
$dir = 'C:\Program Files\Vcmurbas' ; Путь к каталогу программы
$PDL = ProcessList ('ntvdm.exe')
Run (@COMSPEC & ' /C START /SEPARATE ' & $exe, $dir, @SW_HIDE)
$PID = _ProcessListWait($PDL, 'ntvdm.exe')
While ProcessExists($pid)
Sleep(200)
WEnd
; Функция, которая сравнивает списки процессов до появления различий
; и возвращает PID нового процесса.
Func _ProcessListWait (ByRef $arrPLOld, $strPName = '')
Local $i, $arrPLNew, $strPLOld='', $newPID=0
For $i=1 To $arrPLOld[0][0]
$strPLOld &= $arrPLOld[$i][1] &';'
Next
Do
Sleep (100)
If @NUMPARAMS=1 Then $arrPLNew = ProcessList()
If @NUMPARAMS=2 Then $arrPLNew = ProcessList($strPName)
For $i=1 To $arrPLNew[0][0]
If StringInStr($strPLOld, $arrPLNew[$i][1]&';')=0 Then $newPID=$arrPLNew[$i][1]
Next
Until $newPID
Return $newPID
EndFunc
З.Ы. Во 2-м случае можно обойтись без @COMSPEC если настроить систему на запуск каждого 16-битного приложения в отдельном NTVDM-процессе: ключ реестра HKLM\SYSTEM\CurrentControlSet\Control\WOW, параметр DefaultSeparateVDM = "yes"
Creat0R
Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe
Это напряму зависит от того, какой состав скрипта, возможно в скрипте используются данные читаемые при выполнении из самого скрипта - чтобы сказать более точно, необходимо видеть исходный код.
Использовал разные au3, в том числе и от Sanja Alone. Во всех случаях скомпилированный exe имеет объём чуть больше 200 КВ, не зависит от объёма исходного exe и от того, какая прога устанавливается.
amel27
Почему-то был уверен, что поставил WinWait(), уже исправил...А я был уверен что идея принадлежит voler ... :blush:
Это и не ошибка вовсе, а всего лишь другой способ. :sorry:
DiamondЭто и не ошибка вовсе, а всего лишь другой способИМХО при автоматизации установки имеют смысл только два варианта:
- WinWait()+ControlClick()/ControlCommand()
- WinWait()+WinActivate()+Send().
DenchikK
в соответствии с ini файлом, как я понял, переделал так:
Не совсем верно, дело в том, что функция IniReadSection() возвращяет двумерный массив, нулевой элемент ([0]), как и в других обычных массивах, содержит общее число элементов массива.
Построение цикла, должно быть так:
For $i = 1 To NN
Next
Тут For $i = 1, означает что для переменной $i, в теле цикла, будет присваиваться возрастающее значение от 1 и до NN (вместо NN нам и нужно подставить общее число элементов нашего массива, в данном случае, это $Logins_Array[0][0], иногда, обычно самодельные массивы, могут быть построены неверно, поэтому надёжнее проверять общее число массива, используя функцию Ubound, но при этом нужно отнять 1, чтобы нулевой элемент не учитывался:
For $i = 1 To Ubound($Logins_Array) - 1
Next
Или используем нулевой элемент для выявления общего числа элементов массива (не самый надёжный метод):
For $i = 1 To $Logins_Array[0][0]
Next
В справке написано, что функция IniReadSection(), возвращает двумерный массив, теперь его элементы присваиваются так:
Logins_Array[N][0] = Ключь в Ini-Файле
Logins_Array[N][1] = Значение этого же ключа (ключ это то что идёт перед знаком ровно в Ini-файле).
пытался впихнуть строчку
Тут тоже ошибка, ведь в начале идёт проверка переменной, является ли она массивом - If IsArray($Links_Array) Then...
Но в теле условия (If ... Then ... EndIf), массив обрабатывается совсем другой...
GUICtrlCreateRadio($Logins_Array[$i][1], 10, $Top)...
Вот отсюда и может быть вызвана ошибка.
Попытка №2 :) :
(Добавил также немного проверок на ошибочность).
#include <GUIConstants.au3>
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("SendKeyDelay", 60)
AutoItSetOption("MouseCoordMode", 0)
Global $group_1, $group_2, $group_3, $RadioArr[1], $Links_Array, $Logins_Array, $Pass_Array, $Servers_Array, $Secrets_Array
; Запуск программы
Run ('avaload.exe')
; Считывание Данных
$Logins_Array = IniReadSection("ava.ini", "logins")
$Pass_Array = IniReadSection("ava.ini", "pass")
$Links_Array = IniReadSection("ava.ini", "links")
$Servers_Array = IniReadSection("ava.ini", "servers")
$Secrets_Array = IniReadSection("ava.ini", "secrets")
; Построение GUI
GUICreate("Автозаполнение", 340, 350)
If IsArray($Logins_Array) Then
ReDim $RadioArr[UBound($Logins_Array)]
$Top = 20
For $i = 1 To UBound($Logins_Array)-1
$RadioArr[$i] = GUICtrlCreateRadio($Logins_Array[$i][1], 10, $Top)
$Top += 20
Next
EndIf
$Start = GUICtrlCreateButton("Заполнить", 210, 20, 120, 20)
$Close = GUICtrlCreateButton("Выход", 210, 40, 120, 20)
$Server1 = GUICtrlCreateButton("Сервер 1", 210, 60, 120, 20)
$Server2 = GUICtrlCreateButton("Сервер 2", 210, 80, 120, 20)
$group_1 = GUICtrlCreateGroup ("Выбор Аккаунта", 5, 5, 190, 340)
$group_2 = GUICtrlCreateGroup ("Кнопочки", 205, 5, 130, 100)
$group_3 = GUICtrlCreateGroup ("Описание", 205, 105, 130, 240)
$Label1 = GUICtrlCreateLabel(" Описание Работы", 210, 120)
$Label2 = GUICtrlCreateLabel("1. Впишите в ava.ini", 210, 140)
$Label3 = GUICtrlCreateLabel("линки,логины,пароли,", 210, 155)
$Label4 = GUICtrlCreateLabel("параметры серверов.", 210, 170)
$Label5 = GUICtrlCreateLabel("2. Выберите Сервер", 210, 185)
$Label6 = GUICtrlCreateLabel("3. Выберите пустой ", 210, 200)
$Label7 = GUICtrlCreateLabel("аккаунт для заливки. ", 210, 215)
$Label8 = GUICtrlCreateLabel(" Принцип работы: ", 210, 235)
$Label9 = GUICtrlCreateLabel("Например, выбираем", 210, 250)
$Label10 = GUICtrlCreateLabel("первый логин,в него", 210, 265)
$Label11 = GUICtrlCreateLabel("будет заливаться ", 210, 280)
$Label12 = GUICtrlCreateLabel("первый линк. и.т.д", 210, 295)
$Label13 = GUICtrlCreateLabel(" Удачи! ", 210, 315)
GUISetState ()
; Основная Работа Скрипта
GUISetState() ; display the GUI
While 1
Switch GUIGetMsg()
Case -3, $Close
Exit
Case $Server1
If UBound($Servers_Array) < 2 Or UBound($Secrets_Array) < 2 Then
MsgBox(48, "Ошибка", "Извените, невозможно продолжить, видимо не были найдены данные серверов")
ContinueLoop
EndIf
WinActivate ("AvaRemoteLoad")
ControlClick ( 'AvaRemoteLoad', '', "Button4")
WinWaitActive ('Настройки')
ControlSetText ( 'Настройки', '', 'Edit1', $Servers_Array[1][1])
ControlSetText ( 'Настройки', '', 'Edit2', $Secrets_Array[1][1])
ControlClick ( 'Настройки', '', "Button2")
Case $Server2
If UBound($Servers_Array) < 3 Or UBound($Secrets_Array) < 3 Then
MsgBox(48, "Ошибка", "Извените, невозможно продолжить, видимо не были найдены данные серверов")
ContinueLoop
EndIf
WinActivate ("AvaRemoteLoad")
ControlClick ( 'AvaRemoteLoad', '', "Button4")
WinWaitActive ('Настройки')
ControlSetText ( 'Настройки', '', 'Edit1', $Servers_Array[2][1])
ControlSetText ( 'Настройки', '', 'Edit2', $Secrets_Array[2][1])
ControlClick ( 'Настройки', '', "Button2")
Case $Start
Local $iSet = 0
For $i = 1 To UBound($Logins_Array)-1
If GUICtrlRead($RadioArr[$i]) = 1 Then
$iSet = $i
ExitLoop
EndIf
Next
If $iSet = 0 Then
MsgBox(48, "Ошибка", "Выберите пожалуйста один из логинов")
ContinueLoop
EndIf
If $iSet > UBound($Links_Array)-1 Or $iSet > UBound($Logins_Array)-1 Or $iSet > UBound($Pass_Array)-1 Then
MsgBox(48, "Ошибка", "Извените, невозможно продолжить, видимо не были найдены данные линков/логинов/паролей")
ContinueLoop
EndIf
WinActivate ("AvaRemoteLoad")
ControlSetText ( 'AvaRemoteLoad', '', 'Edit1', $Links_Array[$iSet][1])
ControlSetText ( 'AvaRemoteLoad', '', 'Edit2', $Logins_Array[$iSet][1])
ControlSetText ( 'AvaRemoteLoad', '', 'Edit3', $Pass_Array[$iSet][1])
EndSwitch
WEnd
ChVL
Во всех случаях скомпилированный exe имеет объём чуть больше 200 КВ, не зависит от объёма исходного exe и от того, какая прога устанавливается.
Не вижу связи с поставленной проблемой...
Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe
:idontnow:
...И с тем что я написал :)
Creat0R
Ещё конкретнее.
Беру autoit-winamp.au3 (7.43 KB) от Sanja Alone и winamp533_pro.exe (6.33 MB). Компилирую. Теперь autoit-winamp.exe имеет объём 205 КВ. Это правильно? Этот autoit-winamp.exe работает только тогда, когда рядом находится winamp533_pro.exe.
ChVL
Этот autoit-winamp.exe работает только тогда, когда рядом находится winamp533_pro.exe.
Значит в самом скрипте путь к winamp533_pro.exe указан тот же в котором находится сам скрипт, либо вовсе не указан (в таком случае, путь обычно проверяется в соответствии с рабочим каталогом).
Но я всё же не понимаю связи с этим:
Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe
Либо тут неправильная подстановка термина “исходный exe”, либо я чего то недопонимаю... в моём понимании “исходный exe”, это не скомпилированный скрипт :) - именно на основе этого понимания я и ответил:
Это напряму зависит от того, какой состав скрипта, возможно в скрипте используются данные читаемые при выполнении из самого скрипта - чтобы сказать более точно, необходимо видеть исходный код.
А в чём собственно проблема?
Creat0RИли используем нулевой элемент для выявления общего числа элементов массива (не самый надёжный метод):Хм... Почему "ненадежный"?.. Не вижу смысла подсчитывать количество элементов если это уже сделала за нас функция... двойная работа получается. Откуда такое недоверие к разработчикам? ;)
amel27
Откуда такое недоверие к разработчикам?
Я это на всякий случай пишу, потому что лучше перестраховаться, при наличии больших скриптов, можно “не вспомнить” кто создавал массив, встроенная функция, или построенный нами цикл (или просто “рукописный массив”) :)
Я вовсе не утверждал что нужно не доверять встроенным функциям, я им очень даже доверяю (но проверяю ;) ), ведь если бы не доверял, то и небыло бы для меня повода использовать ту же встроенную функцию Ubound() ;)
ChVLТеперь autoit-winamp.exe имеет объём 205 КВ. Это правильно?
Да, правильно.
Этот autoit-winamp.exe работает только тогда, когда рядом находится winamp533_pro.exe.
Естественно, ведь он запускает winamp533_pro.exe, а затем производит над его окном определенные действия. Если же ты хотел, чтобы получился всего один файл, то прочитай справку по fileinstall (). Тогда winamp533_pro.exe будет помещен внутрь скрипта и получится один exe большого размера.
DenchikK
04-06-2007, 13:01
Creat0R
Огромное Вам спасибо! Буду разбираться.
VelDmi
Спасибо!
C помощью FileInstall поместил дистрибутив в скомпилированный скрипт (по размеру скрипта всё сходится). Как теперь сделать так, чтобы скрипт при запуске использовал именно этот exe, а не требовал его снаружи?
Второй вопрос. Как сделать так, чтобы не мелькали окна приложения в процессе установки?
ChVL
Как теперь сделать так, чтобы скрипт при запуске использовал именно этот exe, а не требовал его снаружи?
FileInstall() позволяет помещать файлы в скомпилированный скрипт, чтобы потом они распаковывались в указанное место, вот перед всеми основными действиями скрипта, нужно прописать установку нужного файла, можно распаковывать с любым указанным именем, в данном случае, можно взять имя самого скрипта, и прибавить к нему приставку _Setup:
$WinampPath = StringTrimRight(@ScriptFullPath, 4) & "_Setup.exe"
FileInstall("winamp533_pro.exe", $WinampPath, 1)
Run($WinampPath)
Как сделать так, чтобы не мелькали окна приложения в процессе установки?
Либо запустить приложение в скрытом режиме ( Run($WinampPath, "", @SW_HIDE) ), либо прятать окна в процессе (см. WinSetState("Title", "Text", @SW_HIDE) )
Creat0R
Спасибо!
C FileInstall() разобрался, работает. Не сразу, правда, понял, что AutoIt принципиально не переваривает кириллицу в директории (безуспешно пытался использовать Рабочий стол).
Со скрытым режимом не получается.
Запуск ( Run($WinampPath, "", @SW_HIDE) ) на окна, выскакивающие в процессе установки, не влияет (не скрывает).
Функция WinSetState оказалась несовместимой с WinWaitActive. Если WinSetState ставить перед WinWaitActive, то последняя не работает. Если после - нет смысла, т.к. окно уже промелькнуло.
Эти варианты пробовал и раньше, а другие не нашёл.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.