PDA

Показать полную графическую версию : [Архив - Часть 1.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

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

Вообщем как то так...

Спасибо Вам что Вы со мною возитесь! :-)

voler
01-06-2007, 14:55
Проблема, при отработке скрипта. Ставлю прогу (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

ChVL
01-06-2007, 15:28
Сразу недосмотрел. Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe, т.е. ничем не отличается от работы со скриптом au3. Самостоятельно НЕ запускается - сразу же требует исходный exe. Декомпилировал его с помощью Exe2Aut и увидел, что в него один к одному переписан скрипт и больше ничего нет, хотя объём около 200 KB.
Интересный момент: видимое содержимое декомпилированного exe с одинаковыми именами (который вообще не запускается) абсолютно аналогично описанному выше (это просто текст скрипта), и объёмы у них одинаковы.
Где ещё копать?

Diamond
01-06-2007, 19:29
voler
Ставлю прогу , кто может объясните почему нажатие кнопок не срабатывает.
Проверил несколько кнопок - работает, но только тогда, когда окно активно...
Я бы заменил WinWaitActive на WinWait(), поскольку ControlClick() умеет работать даже с неактивными окнами, и вполне достаточно просто дождаться появления окна.

Creat0R
02-06-2007, 03:19
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


но не получилось, вываливается ошибка. Как сопоставить теперь автоматическое рисование нужного количества радиобутаннов и их работу - ума не приложу...

amel27
03-06-2007, 05:20
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"

ChVL
03-06-2007, 19:55
Creat0R

Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe

Это напряму зависит от того, какой состав скрипта, возможно в скрипте используются данные читаемые при выполнении из самого скрипта - чтобы сказать более точно, необходимо видеть исходный код.
Использовал разные au3, в том числе и от Sanja Alone. Во всех случаях скомпилированный exe имеет объём чуть больше 200 КВ, не зависит от объёма исходного exe и от того, какая прога устанавливается.

Diamond
03-06-2007, 22:15
amel27
Почему-то был уверен, что поставил WinWait(), уже исправил...А я был уверен что идея принадлежит voler ... :blush:
Это и не ошибка вовсе, а всего лишь другой способ. :sorry:

amel27
04-06-2007, 02:37
DiamondЭто и не ошибка вовсе, а всего лишь другой способИМХО при автоматизации установки имеют смысл только два варианта:

- WinWait()+ControlClick()/ControlCommand()
- WinWait()+WinActivate()+Send().

Creat0R
04-06-2007, 02:48
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:

...И с тем что я написал :)

ChVL
04-06-2007, 05:27
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.

Creat0R
04-06-2007, 06:01
ChVL
Этот autoit-winamp.exe работает только тогда, когда рядом находится winamp533_pro.exe.
Значит в самом скрипте путь к winamp533_pro.exe указан тот же в котором находится сам скрипт, либо вовсе не указан (в таком случае, путь обычно проверяется в соответствии с рабочим каталогом).

Но я всё же не понимаю связи с этим:

Скомпилированный exe работает, но только тогда, когда рядом присутствует исходный exe

Либо тут неправильная подстановка термина “исходный exe”, либо я чего то недопонимаю... в моём понимании “исходный exe”, это не скомпилированный скрипт :) - именно на основе этого понимания я и ответил:

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

А в чём собственно проблема?

amel27
04-06-2007, 06:33
Creat0RИли используем нулевой элемент для выявления общего числа элементов массива (не самый надёжный метод):Хм... Почему "ненадежный"?.. Не вижу смысла подсчитывать количество элементов если это уже сделала за нас функция... двойная работа получается. Откуда такое недоверие к разработчикам? ;)

Creat0R
04-06-2007, 06:43
amel27
Откуда такое недоверие к разработчикам?
Я это на всякий случай пишу, потому что лучше перестраховаться, при наличии больших скриптов, можно “не вспомнить” кто создавал массив, встроенная функция, или построенный нами цикл (или просто “рукописный массив”) :)

Я вовсе не утверждал что нужно не доверять встроенным функциям, я им очень даже доверяю (но проверяю ;) ), ведь если бы не доверял, то и небыло бы для меня повода использовать ту же встроенную функцию Ubound() ;)

VelDmi
04-06-2007, 06:44
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
Огромное Вам спасибо! Буду разбираться.

ChVL
04-06-2007, 17:04
VelDmi
Спасибо!
C помощью FileInstall поместил дистрибутив в скомпилированный скрипт (по размеру скрипта всё сходится). Как теперь сделать так, чтобы скрипт при запуске использовал именно этот exe, а не требовал его снаружи?

Второй вопрос. Как сделать так, чтобы не мелькали окна приложения в процессе установки?

Creat0R
04-06-2007, 18:49
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) )

ChVL
04-06-2007, 21:07
Creat0R
Спасибо!
C FileInstall() разобрался, работает. Не сразу, правда, понял, что AutoIt принципиально не переваривает кириллицу в директории (безуспешно пытался использовать Рабочий стол).

Со скрытым режимом не получается.
Запуск ( Run($WinampPath, "", @SW_HIDE) ) на окна, выскакивающие в процессе установки, не влияет (не скрывает).
Функция WinSetState оказалась несовместимой с WinWaitActive. Если WinSetState ставить перед WinWaitActive, то последняя не работает. Если после - нет смысла, т.к. окно уже промелькнуло.
Эти варианты пробовал и раньше, а другие не нашёл.




© OSzone.net 2001-2012