Что нового

Компиляция через скомпилированный скрипт

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
Когда я всерьез начал увлекаться autoit, кто то мне на этом форуме сказал, что скомпилированный скрипт может компилировать другие. Так вот вопрос как мне это сделать?

То есть, (код пока в процессе) готовый и скомпилированный скрипт, пишет другой скрипт по заданным пользователем параметрам. Подразумевается, что этот процесс будет происходить на компьютерах без autoit. Так вот. Как сделать так что бы скрипт на выходе автоматически компилировался?

Заранее спасибо
 

firex

AutoIT Гуру
Сообщения
943
Репутация
206
VermanVendetta13
ИМХО, Для вашей задачи компилирование далеко не лучший вариант решения, скорее - наихудший. Неужели генерировать скрипт на ваш взгляд проще, чем изначально написать его в "универсальном" алгоритме?

Другое дело - если вам заранее неизвестен алгоритм и получаете вы его, к примеру, через интернет. В этом случае следует разместить скрипт в скомпилированном виде (A3X), загружать его на целевой компьютер и, предварительно продублировав себя:
1) Заменить скрипт в ресурсах RCDATA\SCRIPT.
2) Удалить оригинальный скрипт из ресурсов и дописать новый в оверлей.

Так же можно запустить скрипт в формате A3X из-под памяти (без предварительного сохранения на диск и его выгрузке ДО завершения работы скрипта).

Всю информацию вы можете найти на форуме, а на счет последнего, если потребуется, могу состряпать пример.
 
Автор
V

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
firex сказал(а):
VermanVendetta13
ИМХО, Для вашей задачи компилирование далеко не лучший вариант решения, скорее - наихудший. Неужели генерировать скрипт на ваш взгляд проще, чем изначально написать его в "универсальном" алгоритме?

Другое дело - если вам заранее неизвестен алгоритм и получаете вы его, к примеру, через интернет. В этом случае следует разместить скрипт в скомпилированном виде (A3X), загружать его на целевой компьютер и, предварительно продублировав себя:
1) Заменить скрипт в ресурсах RCDATA\SCRIPT.
2) Удалить оригинальный скрипт из ресурсов и дописать новый в оверлей.

Так же можно запустить скрипт в формате A3X из-под памяти (без предварительного сохранения на диск и его выгрузке ДО завершения работы скрипта).

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


Пример бы мне не помешал. Если есть возможность прошу состряпать.

И немного о том что я делаю. Дело в том, что я пишу программу которая будет создавать грубо говоря страничные тексты, которые будут в своем роде под защитой. А универсального алгоритма к сожалению не выйдет. Ибо количество страниц у разных пользователей как правило разное + ко всему для каждого пользователя есть различные опции для их версии созданной програмки. И алгоритм добавления опций на каждую страницу в разное время создания так же разный. И именно поэтому, как я думаю, что компиляция само то, что надо.

Ведь мне не нужно защищать то, что будет твориться в процессе создания. Главное что бы у пользователя была свобода выбора опций и он мог делать все что ему необходимо.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Может быть вам подойдёт не компиляция, а обычное выполнение?
Например так:
Код:
#pragma compile(AutoItExecuteAllowed, true)
Global $hFile, $sFilename, $sCriptCode
$sFilename = @ScriptDir & "\test_tmp.au3"
$sCriptCode = '_main()' & @CRLF & @CRLF & _
		'Func _main()' & @CRLF & @TAB & _
		'MsgBox(0, "random", "' & Random(1111, 2222, 1) & '")' & @CRLF & _
		'EndFunc'

$hFile = FileOpen($sFilename, 2)
FileWrite($hFile, $sCriptCode)
FileClose($hFile)
ShellExecuteWait(@AutoItExe, '/AutoIt3ExecuteScript "' & $sFilename&'"')
;FileDelete($sFilename)
 
Автор
V

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
alex33 сказал(а):
Может быть вам подойдёт не компиляция, а обычное выполнение?
Например так:
Код:
#pragma compile(AutoItExecuteAllowed, true)
Global $hFile, $sFilename, $sCriptCode
$sFilename = @ScriptDir & "\test_tmp.au3"
$sCriptCode = '_main()' & @CRLF & @CRLF & _
		'Func _main()' & @CRLF & @TAB & _
		'MsgBox(0, "random", "' & Random(1111, 2222, 1) & '")' & @CRLF & _
		'EndFunc'

$hFile = FileOpen($sFilename, 2)
FileWrite($hFile, $sCriptCode)
FileClose($hFile)
ShellExecuteWait(@AutoItExe, '/AutoIt3ExecuteScript "' & $sFilename&'"')
;FileDelete($sFilename)


Да нет же. Мне нужна именно компиляция
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
За компиляцию отвечает утилита Aut2Exe, которая не включается в скомпилированный скрипт. Поэтому скомпилированный скрипт сам не может ничего компилировать. Если хотите компилировать на стороне, то вам как минимум нужно приложить к вашей программе Aut2Exe.exe. Ну и придется тянуть за собой все используемые библиотеки.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Да, точно. Можно через FileInstall включить компилятор, а потом распоковывать, компилировать и после компиляции удалять ненужные файлы... Можно так.
 
Автор
V

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
alex33 сказал(а):
Да, точно. Можно через FileInstall включить компилятор, а потом распоковывать, компилировать и после компиляции удалять ненужные файлы... Можно так.

Alex33, я посмотрел FileInstal, только не очень его понял. Если не затруднит, можешь живой пример сделать с компилятором?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
VermanVendetta13 [?]
Если не затруднит, можешь живой пример сделать с компилятором?
Примерно так (Скачать пример compile_au3_exampleFileInstall.zip 3322.42 kb):
Код:
#pragma compile(AutoItExecuteAllowed, true)
Global $hFile, $sFilename, $sFilenameExe, $sFilenameIco, $sFilenameCompiler, $sCriptCode
$sFilename = @TempDir&"\test_tmp.au3"
$sFilenameExe = @ScriptDir & "\test_tmp.exe"
$sFilenameIco = @TempDir&"\script.ico"
[email protected]&"\Aut2Exe.exe"
$sCriptCode = '_main()' & @CRLF & @CRLF & _
		'Func _main()' & @CRLF & @TAB & _
		'MsgBox(0, "random", "' & Random(1111, 2222, 1) & '")' & @CRLF & _
		'EndFunc'

FileInstall(".\script.ico", $sFilenameIco,1)
FileInstall(".\Aut2exe.exe", $sFilenameCompiler,1)
$hFile = FileOpen($sFilename, 2)
FileWrite($hFile, $sCriptCode)
FileClose($hFile)
ShellExecuteWait($sFilenameCompiler, '/in "' & $sFilename & '" /out "'&$sFilenameExe&'" /icon "'&$sFilenameIco&'" /ignoredirectives /nopack')
FileDelete($sFilename)
Run($sFilenameExe)
 
Автор
V

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
alex33 сказал(а):
VermanVendetta13 [?]
Если не затруднит, можешь живой пример сделать с компилятором?
Примерно так (Скачать пример compile_au3_exampleFileInstall.zip 3322.42 kb):
Код:
#pragma compile(AutoItExecuteAllowed, true)
Global $hFile, $sFilename, $sFilenameExe, $sFilenameIco, $sFilenameCompiler, $sCriptCode
$sFilename = @TempDir&"\test_tmp.au3"
$sFilenameExe = @ScriptDir & "\test_tmp.exe"
$sFilenameIco = @TempDir&"\script.ico"
[email protected]&"\Aut2Exe.exe"
$sCriptCode = '_main()' & @CRLF & @CRLF & _
		'Func _main()' & @CRLF & @TAB & _
		'MsgBox(0, "random", "' & Random(1111, 2222, 1) & '")' & @CRLF & _
		'EndFunc'

FileInstall(".\script.ico", $sFilenameIco,1)
FileInstall(".\Aut2exe.exe", $sFilenameCompiler,1)
$hFile = FileOpen($sFilename, 2)
FileWrite($hFile, $sCriptCode)
FileClose($hFile)
ShellExecuteWait($sFilenameCompiler, '/in "' & $sFilename & '" /out "'&$sFilenameExe&'" /icon "'&$sFilenameIco&'" /ignoredirectives /nopack')
FileDelete($sFilename)
Run($sFilenameExe)

Спасибо Alex33)))) большушее спасибо))
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Автор
V

VermanVendetta13

Новичок
Сообщения
147
Репутация
0
alex33 сказал(а):
VermanVendetta13 [?]
Если не затруднит, можешь живой пример сделать с компилятором?
Примерно так (Скачать пример compile_au3_exampleFileInstall.zip 3322.42 kb):
Код:
#pragma compile(AutoItExecuteAllowed, true)
Global $hFile, $sFilename, $sFilenameExe, $sFilenameIco, $sFilenameCompiler, $sCriptCode
$sFilename = @TempDir&"\test_tmp.au3"
$sFilenameExe = @ScriptDir & "\test_tmp.exe"
$sFilenameIco = @TempDir&"\script.ico"
[email protected]&"\Aut2Exe.exe"
$sCriptCode = '_main()' & @CRLF & @CRLF & _
		'Func _main()' & @CRLF & @TAB & _
		'MsgBox(0, "random", "' & Random(1111, 2222, 1) & '")' & @CRLF & _
		'EndFunc'

FileInstall(".\script.ico", $sFilenameIco,1)
FileInstall(".\Aut2exe.exe", $sFilenameCompiler,1)
$hFile = FileOpen($sFilename, 2)
FileWrite($hFile, $sCriptCode)
FileClose($hFile)
ShellExecuteWait($sFilenameCompiler, '/in "' & $sFilename & '" /out "'&$sFilenameExe&'" /icon "'&$sFilenameIco&'" /ignoredirectives /nopack')
FileDelete($sFilename)
Run($sFilenameExe)

Alex, один маленький нюанс хочу уточнить. Я твой скрипт уже изучил и попробовал сделать на основе. Все работает, но а как же туда включить библиотеки? Я уже и по папкам разным кидал? Не подкинешь идейку?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
VermanVendetta13 [?]
Alex, один маленький нюанс хочу уточнить. Я твой скрипт уже изучил и попробовал сделать на основе. Все работает, но а как же туда включить библиотеки? Я уже и по папкам разным кидал? Не подкинешь идейку?
Да... С ними проблемка будет, а FileInstall как известно принимает только файлы, по одному и без папок. На форуме уже что-то было такое, например Как заставить FileInstall работать с каталогами?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Если в теме присутствует "лучший ответ", то это автоматически предполагает решение поставленной задачи. Либо убираем "лучший ответ", либо помечаем тему решенной, либо я блокирую тему.
 

Crazy Kvace

Знающий
Сообщения
30
Репутация
7
firex сказал(а):
Так же можно запустить скрипт в формате A3X из-под памяти (без предварительного сохранения на диск и его выгрузке ДО завершения работы скрипта).

firex можно пожалуйста пример? если не сложно...

OffTopic:

ИМХО нечто похожее для запуска EXE https://www.autoitscript.com/forum/topic/116040-run-exe-from-memory-3264-bit/
 
Верх