Что нового

Запуск exe ресурса из скрипта

Сообщения
80
Репутация
-1
Ответов не нашёл, как и на многое в рунете, но как обычно нашлось на буржуйском форуме.
Пишу скорее для себя. Когда придумал это название, нашлась одна тема, но её закрыли так и не найдя решения.

Суть такая.
Есть утилита от НЕГО всего 80кб(ужимается до 25кб), идёт с набором для разработчиков, можно скачать на сайте качалку которая вытянет больше гига всякого хлама, который ещё надо кудато поставить, и потом зная где взять эту утилиту.
Можно без установки, но в последних версиях названия пакетов какаето дичь и в каком она лежит непонятно.
Так что самый простой способ её получить это запихать в сам скрипт.
Выгугливать и подкладывать в системную папку, это долго.

Почему именно запуск, а не распаковка во временное место.
Не хочу замусоривать , прога и так создаёт 2 конфига(с настройками проги и пользователя) и всяких разных логов, там же и папки с тем что она запускает.
Чуть что проще будет снести всё оставив только сам скрипт.
Перед каждым запуском проверять не удалил ли её пользователь както долго.
Можно положить в отдельную папку, но она будет только мешать. Кудато во временную я не хочу.
В общем хочу вшить и всё.

Можно реализовать и на самом autoit, но мне пока не ясно как этим то пользоваться, так что начну с простого.
Собираем на
AutoIt 3.3.14.2 SciTE4AutoIt 3.7.3
в моём случае для x64 Win7, Win10 , язык русский, поддержка другиг ОС не планируется.

Раз уж используется AutoIt3Wrapper , а из коробки IDE не работает, но начну с настройки SciTE
которую я искал 5 дней и 3 года.

Если не использовать обфускацию, то из коробки работает, только скрипт весит на 20% больше, а памяти сжирает в 3 раза больше. Так что в финальной сборке он нужен.

AU3Stripper работает только с UTF8BOM , в остальных случаях портит кодировку и не может даже правильно читать директивы AutoIt3Wrapper и тем туда чтото писать.

После установки SciTE работает на неведомом языке. Чтоб в ней стало возможно создать файл, надо в настройки пользователя вписать
Код:
NewFileEncoding=UTF8BOM
хорошо хоть в глобальных стоит
Код:
utf8.auto.check=4
и она не портит файлы.
Вот теперь в ней можно создать файл который нормально скомпилируется.

Но поскольку у ней в отличии от старой версии почемуто отвалилась прокрутка, то добавлю ещё
Код:
output.scroll = 2

И чтоб было проще тыкать кнопочки приделал язык
Код:
locale.properties=locale.properties
файл взял откудато с интернета по первой ссылке и положил в папку с самим SciTE.exe. Пришлось его перекодировать в ansi через n++ чтоб кодировка русификации в окне была нужной. Тут есть другие файлы, проверять их было уже лень.

Как запустить файл нашлось на буржуйской форуме . Автор требует чтоб изучили как это работает, а не просто пихали к себе, так придётся работать руками.
Тут я взял RunBinary.au3 , включил версию x64 и закоментировал всё до функций.

Вот что получилось. Создаём и собираем неважно какой файл, но важно для какой системы он собран
bin.au3
Код:
#AutoIt3Wrapper_UseX64=y 
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_After="%autoitdir%\Aut2Exe\Upx.exe" %out% --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=1 --strip-relocs=1

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("exe", 150, 100,100,100)
GUISetOnEvent(-3, '_exit', $hGUI)
GUISetState(@SW_SHOW)

While 1
WEnd

Func _exit()
Exit
EndFunc
Через MemoryDll Generator из bin.exe создаю srcbin.au3 с переменной bBinary

Этим он будет запускаться
Код:
#AutoIt3Wrapper_UseX64=y
Opt("GUIOnEventMode", 1)

#include <srcbin.au3>
#include <RunBinary.au3>



$hGUI = GUICreate("gui", 150, 50)

GUISetOnEvent(-3, '_exit', $hGUI)

GUICtrlCreateButton("1", 10, 10, 30, 30)
GUICtrlSetOnEvent(-1, "_btn1")

GUICtrlCreateButton("2", 50, 10, 30, 30)
GUICtrlSetOnEvent(-1, "_btn2")

GUISetState(@SW_SHOW)

While 1
WEnd

Func _exit()
Exit
EndFunc

Func _btn1()
	_RunBinary($bBinary)
	MsgBox(262144, "","" )
EndFunc

Func _btn2()
MsgBox(262144, "","Exit" )
_exit()
EndFunc
В общем пробничек получился, но как передать параметры, и важно чтоб все файлы были 64.

Хотя тут вродебы примерно можно понять
Код:
Func _RunBinary($bBinaryImage, $sCommandLine = "", $sExeModule = @AutoItExe)
параметры и через что запускать, но вот как это вытащить с cmd

Вообщето я искал как ресурс запустить, но вот только это получилось, и то не совсем понятно
 
A

Alofa

Гость
winix сказал(а):
... Раз уж используется AutoIt3Wrapper...
Можно и без него, через контекстное меню файлов .au3 или запустите "Aut2exe.exe" и следуйте указаниям.

winix сказал(а):
... а из коробки IDE не работает...
Совсем, совсем? :smile:

winix сказал(а):
... Если не использовать обфускацию...
Покажите мне обфускатор в AutoIt 3.3.14.2.

winix сказал(а):
... AU3Stripper работает только с UTF8BOM...
Да ну...

winix сказал(а):
... AU3Stripper <...> не может даже правильно читать директивы AutoIt3Wrapper ...
А почему она должна их понимать? Читайте.

winix сказал(а):
... в настройки пользователя вписать...
В какие настройки пользователя, где они находятся? Этот пост же будут читать люди, в том числе и новички.

winix сказал(а):
...
Код:
NewFileEncoding=UTF8BOM
хорошо хоть в глобальных стоит...
А коментарий выше этой строчки читали?
# detect ascii high characters and if none found set default encoding to UTF8 and do not add BOM
Создайте .au3 файл в кодировке UTF8 с BOM, откройте в SciTE, нажмите проверку CTRL+F5 и получите в консоли:
! Au3check doesn't support input files encoded as UTF8 with BOM:
К стати вы в курсе о иерархии файлов настроек?

winix сказал(а):
... отвалилась прокрутка...
По умолчанию строка закомментирована:
Код:
#output.scroll=0

И еще напомню:
winix сказал(а):
... Автор требует чтоб изучили как это работает, а не просто пихали к себе...
 
Автор
W
Сообщения
80
Репутация
-1
Частично всмотревшись можно заметить что авторское решение привязано к разрядности файла. Если скрипт собран под 64 бита, то и выполняемый в памяти файл он видит как 64. Почему он его не видит как 32 не понятно, чтото такое там есть. Какуюто документацию не положили.
Файл у меня будет выполнятся из основной программы, значит её разрядность я сменить не могу и она будет основная 64 .
Но и файл тогда должен быть в 64, а что делать если он только в 32 существует. О мультисистемности вообще непонятно, в авторском скрипте она указана жёстко.

Хотя может я поставил 32 autoit после последних переделок и поэтому у меня в 32 ничего не работает.

о кодировке
С коробки то он работает, но без поддержки кирилицы, это я о полной версии.
Не знаю кто его собирал, но очень похоже что он мало отличается от чистой версии, просто доложили пару файликов чтоб добавить autoit, а учитывая что в этой стране прога крайне не популярна, то и не о каких руских никто и не думал поправлять кодировку, работает да и ладно. Греческие буквы там не пишут, а слова на латыне он показывает правильно.

Ничего он не пишет, он просто перекодирует в utf8 и не важно какой исходник.
Если он bom он его не трогает, если это ansi , делает его utf8 заодно портя остальные знаки, но это теперь.
Но если не вписать NewFileEncoding=UTF8BOM , то он файл открывает в непонятной кодировке не поддерживающей кирилицу вообще, и с этой непонятной переводит в utf8 портя вообще всё.

Видимо от utf8.auto.check=4 толку мало, можно попробовать выставить 0, но мне уже лень.
Есть 2 факта с ними и останемся. Файлы для scite должны быть только utf8, и она должна быть настроена на них во всех 5 местах или сколько их там. Любые другие файлы она испортит.

n++ 64 портит файлы при перекодировании, возможно и 32 такой. Хоть он и удобен я заметил насколько же он крив, и не только физически кривой интерфейс подсветки и отсутствие локализации сообщений. И куча заброшеных офсайтов . Не говоря о нежелании разработчиков выкладывать 64 версии плагинов, даже если их ктото собрал.
Но аналогов по распечатки подсветки нет.
Наверно надо вернутся на 32.
А почему она должна их понимать? Читайте.
потомучто он создаёт временный исходник в другой кодировке если не может её понять, у меня он находил какойто мусор в этом utf8 файле и создавал новый исходник в ansi , из которого уже и начинал собирать AutoIt3Wrapper , но понять его не мог .

В общем n++ возможно накосячил перекодируя файл, но старый то файл был создан старой scite lite в ansi , а новая его испортила. Так что кто виновник не знаю, но скорее всего оба.

Мне почемуто стало интересно, а тот scite lite который идёт с новой версией, может он тоже в ansi работает. Хотя он с ним не идёт, значит сборщики scite намудрили
Иерархию я предположил
Понятно что пользовательский важнее глобального. Я бы туда и не писал, и сразу бы лез в глобальный. Но в нём просторнее и на их форумах пишут что так тоже работает. У нас же все почемуто пишут в глобальный.

Но потом я запустил SciteConfig и он в пользовательский столько нафигачил.
Лишние меню я убрал, но название меню даже на родной языке кардинально разные и не понятно где что, а после русификации тоже мало что изменилось.
Названия в конфигураторе совсем другие.
Так что в пользовательском теперь проще разом всё снести.

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

В локальный писать незачем, он пустой, мне не нужна версия привязанная к профилю, и я всё равно не уверен что она будет портативной, видимо гдето в настройках этот локальный тоже надо выключать.
Но смысла в этом нет пока она привязана к autoit по стандартному пути.

Настройки каталога не знал, но они же всё равно не работают над локальным, тогда что с них толку, если этот файл в моём проекте никому не поможет.

Может тоже под спойлер свой пост завернёте кроме последней цитаты по теме.
 
Верх