Что нового

[Новая функция] Запись в саму себя

V

VitAl2013

Гость
Берём скрипт, компилируем в ехе. При работе такого ехе он сохраняет свои настройки (папки по умолчанию, язык интерфейса и т.д. - можно много чего туда полезного положить) внутри себя. В идеале надо научить его понимать внутреннюю структуру самого себя, чтоб можно было писать ссылки ниже ехе, например "...\script.exe\include\defaults.ini". Может понадобиться сделать другой пакер в exe для этого, а то может внутренняя иерархия сейчас хаотична и не приспособлена для таких манипуляций.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Написано вроде много, а понять не удалось. Конкретнее и попроще можно - что именно требуется?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,578
Репутация
335
Метод записи "в себя" противоречит операционной системе. Т.е. пока программа выполняется, ты ее даже скопировать не сможешь! (Бывали случаи когда даже открытая папка не копировалась :D(но это скорее всего глюк))
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR сказал(а):
Написано вроде много, а понять не удалось. Конкретнее и попроще можно - что именно требуется?
А у меня немного проявляются экстрасенсорные возможности :smile:
Человек хочет иметь возможность хранить данные, не создавая никаких файлов и не делая никаких записей в реестре. (Имеется в виду, что даже после завершения работы скрипта :smile:)
Ни одна из известных мне программ так не умела.

Могу только предложить хранить данные в отдельных потоках. Будет весело ;D
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,578
Репутация
335
SyDr [?]
А у меня немного проявляются экстрасенсорные возможности
Тогда и у меня тоже. Грубо говоря человек хочет сделать файл-архив. В который будут включены любые файлы, и будет включена возможность поддержки путей типа:
VitAl2013 [?]
script.exe\include\defaults.ini

Ой да не говори :D
 
Автор
V

VitAl2013

Гость
Про потоки и тем более хранение в них данных это я пока не понял.

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

Объясню по другому:
1. На выходе получаем файл proga.exe
2. Он по сути архив. В котором скрипт (пусть script.au3), интерпретатор и ресурсы.
3. Скрипт выполняет свою работу и предположительно находиться в оперативной памяти. Считывает, изменяет файлы ресурсы.

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

Что такое exe сам по себе. Из того что я знаю программа перед преобразованием в exe проходит 2 стадии компилирования и линковки, наружу торчит только хвост функции main. По сути это архив, только данные не архивируются, а компилируются. А что если вмешаться в принцип создания exe файла? Или, например, на основе 7zip архиватора сделать sxf архив (ну так упрощённо, можно более изощрённо) при запуске которого бы происходило раскрытие (в темпы или в оперативу) файла скрипта и файла интерпретатора с последующим запуском, затем происходило бы использование изначального exe как архива. Не помню какой архиватор так мог, но оттуда я и взял пути ниже *.exe уровня. Он так мог в своём клиенте. Пишешь ему в строке такой путь, а он открывает его как будто это папка. Да к стати, может же винда работать с зипами и жатыми дисками как с обычными папками? - может. Ну и вот, а почему бы не научить autoit работать со своими exe-шниками также?

На счёт скепсиса. Я видел виртуальные винчестеры хранимые в оперативной памяти. По моему это задача похлеще.

И вообще как-то не конструктивно. Складывается впечатление, что лишь бы унизить (типа вот выдумщик ещё один, нука мы его опустим), а не понять и, например, высказать свои "почему нет в популярном изложении".
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
VitAl2013 [?]
Вопрос как он это делает, раскрывает всё в темп папки или всё крутит в оперативной памяти это не так важно. Важно что может.
Делается это механизмами упаковки и распаковки данных, и не в память а во временные папки. В нашем случае можно использовать консольную версию 7zip.

почему бы не научить autoit работать со своими exe-шниками также?
Также это как, обращаться к сжатому архиву как к папке? ну насколько мне известно там тоже происходит предварительная распаковка, а мы уже видим виртуальную оболочку результата. И научить AutoIt это делать можно, главное знать что конкретно требуется.

И вообще как-то не конструктивно. Складывается впечатление, что лишь бы унизить (типа вот выдумщик ещё один, нука мы его опустим)
И с какого перепугу приходит такое впечатление? Никто никого тут не собирается унижать/опускать, просто все пытаются понять в чём затея. А скептизм как мне кажется, проявляется от недостатка опыта в AutoIt :whistle:
 
Автор
V

VitAl2013

Гость
главное знать что конкретно требуется
Прям не знаю как конкретней ещё... там есть какое-нибудь варианты? 50на50 или там звонок другу, помощь зала? :-[

Ну попробую ещё раз. Примерный текст скрипта (@ScriptName.au3).

Код:
Вложить при компиляции: файл.ini в папку @ScriptName.exe\ресурсы\
...
Считать значение параметра №1 из @ScriptFullPath\@ScriptName.exe\ресурсы\файл.ini
...
Записать значение параметра №2 в @ScriptFullPath\@ScriptName.exe\ресурсы\файл.ini

И с какого перепугу приходит такое впечатление?
Значит я ошибся
 

SyDr

Сидра
Сообщения
651
Репутация
158
Назови хоть одну программу, которая умеет так делать.
Ни один архиватор никогда ничего не писал сам в себя. Только в отдельные архивы.
В любом случае понадобиться промежуточный файл. Это устраивает?

Ещё раз про потоки: практически идеальный вариант. Минусы: необходимость использования файловой системы NTFS. Архив придёться создавать винраром.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
VitAl2013 [?]
Прям не знаю как конкретней ещё... там есть какое-нибудь варианты? 50на50 или там звонок другу, помощь зала?
А вот сарказм некчему.

Ну попробую ещё раз. Примерный текст скрипта (@ScriptName.au3).
Хорошо, чуть позже выложу exe'шник который это выполняет (рядом будут и исходники), если меня конечно не подведёт теория :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Написал скриптик. Работает следующим образом:
Распаковывает файлы Script.au3 и Script.dat в временную папку.
Запускает на выполнение Script.au3 с параметрами, переданными основному скрипту и рабочей папкой основного файла (один exe-файл).
Дожидается окончания работы Script.au3
Достаёт из себя файлы, необходимые для компиляции скрипта.
Компилирует скрипт пересборки. ;)
Запускает его и завершает свою работу.
Скрипт пересборки удаляет основной файл.
Компилирует на его место файл с изменённым Script.dat
Запускает скрипт очистки и завершает свою работу.
Скрипт очистки удаляет всё лишнее из временной папки.

Громоздко и долго, но результат работает.
Скомпилированный скрипт, добавлющий в Script.dat строчку "Line" весит при этом чуть больше 1 Мб.
Подойдёт такой вариант?

Только что придумал ещё один вариант: Rarjpeg. Только теперь он будет называться 7zipexe (Ну или архив какого-либо другого типа). Вроде бы полёт нормальный и скрипт не ругается на дописанный в себя архив. Правда, опять таки, нужен промежуточный файл, который это дело будет пересобирать. Зато в этом случае не надо заново компилировать скрипт.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
SyDr
А как он компилирует? в архив помещён сам Aut2Exe? :-\
 
Автор
V

VitAl2013

Гость
SyDr
Не вижу ссылок. :blink: Это глюк?
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
А как он компилирует? в архив помещён сам Aut2Exe?
undecided.gif
Да ;) Он, бинарник для компиляции, upx, исходный код "автономного комплекса", начальный скрипт и файл с настройками. В любом случае, нужна как минимум одна компиляция. У меня две. Режил пожертвовать скоростью ради размера ;).


VitAl2013 [?]
Не вижу ссылок.
blink.gif
Это глюк?
Пример в архиве. Распаковать 7zExe.exe как архив.

Recycle.au3
Код:
DirRemove(@WorkingDir, 1)

StandAloneRebuild.au3
Код:
$sCompileTo = $CMDLineRaw
$sWorkindDir = @WorkingDir & "\"
FileDelete($sCompileTo)
RunWait($sWorkindDir & 'Aut2exe.exe /in "' & $sWorkindDir & 'StandAloneComplex.au3" /out "' & $sCompileTo & '"', $sWorkindDir)
Exit Run($sCompileTo & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sWorkindDir & 'Recycle.au3"', $sWorkindDir)

StandAloneComplex.au3
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
If Not @Compiled Then Exit
$sWorkindDir = @WorkingDir

$sTempWDir = _TempFile(@TempDir, '~', '.autoit', 7) & '\'
DirCreate($sTempWDir)

FileInstall('Script.au3', $sTempWDir & 'Script.au3')
FileInstall('Script.dat', $sTempWDir & 'Script.dat')
RunWait(@ScriptFullPath & ' /ErrorStdOut /AutoIt3ExecuteScript "' & $sTempWDir & 'Script.au3" ' & $CMDLineRaw, $sTempWDir)

FileInstall('Aut2exe.exe', $sTempWDir & 'Aut2exe.exe')
FileInstall('AutoItSC.bin', $sTempWDir & 'AutoItSC.bin')
FileInstall('StandAloneRebuild.au3', $sTempWDir & 'StandAloneRebuild.au3')
FileInstall('StandAloneComplex.au3', $sTempWDir & 'StandAloneComplex.au3')
FileInstall('upx.exe', $sTempWDir & 'upx.exe')
FileInstall('Recycle.au3', $sTempWDir & 'Recycle.au3')
RunWait($sTempWDir & 'Aut2exe.exe /in "' & $sTempWDir & 'StandAloneRebuild.au3" /out StandAloneRebuild.exe', $sTempWDir)
Exit Run($sTempWDir & 'StandAloneRebuild.exe ' & @ScriptFullPath, $sTempWDir)

; #FUNCTION# ====================================================================================================================
; Name...........: _TempFile
; Description ...: Generate a name for a temporary file. The file is guaranteed not to exist yet.
; Syntax.........: _TempFile([$s_DirectoryName = @TempDir[, $s_FilePrefix = "~"[, $s_FileExtension = ".tmp"[, $i_RandomLength = 7]]]])
; Parameters ....: $s_DirectoryName - Optional: Name of directory for filename, defaults to the users %TEMP% directory
;                  $s_FilePrefix    - Optional: File prefixname, defaults to "~"
;                  $s_FileExtension - Optional: File extenstion, defaults to ".tmp"
;                  $i_RandomLength  - Optional: Number of characters to use to generate a unique name, defaults to 7
; Return values .: Success - Filename of a temporary file which does not exist
; Author ........: Dale (Klaatu) Thompson
; Modified.......: Hans Harder - Added Optional parameters
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func _TempFile($s_DirectoryName = @TempDir, $s_FilePrefix = "~", $s_FileExtension = ".tmp", $i_RandomLength = 7)
	Local $s_TempName
	; Check parameters
	If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @TempDir ; First reset to default temp dir
	If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @ScriptDir ; Still wrong then set to Scriptdir
	; add trailing \ for directory name
	If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
	;
	Do
		$s_TempName = ""
		While StringLen($s_TempName) < $i_RandomLength
			$s_TempName = $s_TempName & Chr(Random(97, 122, 1))
		WEnd
		$s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
	Until Not FileExists($s_TempName)

	Return ($s_TempName)
EndFunc   ;==>_TempFile


http://autoit.rv.ua/files/Other/Test.7z


НО! Это вариант неполноценный, неправильный, негодный и недостойный использования. Использовать его не рекомендую :smile:
OffTopic:
(Несмотря на то, что сам написал)


Сегодня-завтра напишу пример (возможно, даже полноценный), основанный на RarJpeg.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Вобщем вот, используется 7zip (модуль для Install-пакетов).

* В архиве есть сам скрипт, его скомпилированная версия, и готовый SFX-архив.
* Скрипт определяет откуда он запущен, и соответственно выполняет действия - если с обычной папки, то гинерирует SFX-архив, если из временной папки (предполагается что SFX-архив туда будет распаковывать), то запускает тело скрипта (вывод параметра в ini, и запись в тот же параметр другого значения), и по окончанию собирает всё обратно, с уже изменёнными данными.
* Для демонстраций работы, файл «MyInstaller.exe» нужно запустить один раз, увидеть результат, и затем запустить снова (Внимание: для сбора архива требуется время, поэтому запускать не сразу), и сравнить результат ;)
* Файл Config.txt определяет настройки, для подробностей см. доки к 7zip.

Скачать (967.34 kb).
 

SyDr

Сидра
Сообщения
651
Репутация
158
Попробую тоже описать своё чудо :smile: :

Тоже используется 7-zip. Консольная версия.
* В архиве сама "UDF", скрипт примера, скомпилированный скрипт примера и сам 7-zip
* Используется две функции:
_StandAloneAddOrUpdateFiles($sPathToFiles, $nScriptSize)
$sPathToFiles - путь к папке для включения в скрипт. Будет удалена после окончания работы. Будьте осторожны ;D
$nScriptSize - размер exe-файла скрипта. Укажете меньше и вы его обрежете :D Укажете больше -> будете таскать с собой лишнии данные.
Возвращаемое значение - нет. Работа скрипта будет завершена автоматически.

_StandAloneExtractFiles($sExtractTo = "0", $sArchiveName = 'Data.zip')
$sArchiveName - что-то позновато заметил >_< Нигде не используется
$sExtractTo - куда извлекать. Если равно 0 - будет создана папка во временной папке
Возвращаемое значение - путь к папке. @extended равен размеру основного exe-файла.

* Для демонстрации примера запускаем FirstTest.exe Честно отвечаем на вопрос. Чуть-чуть ждём. Запускаем exe ещё раз. Честно отвечаем на вопрос. Видим сообщение: размер основного скрипта и путь к папке. Нажимаем ОК. Видим ещё одно сообщение. Чуть-чуть ждём и... запускаем ещё раз. Ну и дальше по ситуации...

* Настроек нет. :laugh:
Скачать
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
SyDr [?]
Попробую тоже описать своё чудо
У меня что то записанная строка не отображается (пустой msgbox)...

Этот комплекс использует установленный в системе AutoIt, или я что-то не понял, как всё таки компилируется скрипт? И для чего 7zip?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Структура файла:
Скомпилированный скрипт.
Архив.
Севен-зип.
24 байта - размеры скрипта, архива и севен-зипа.
Потом этот файл разбирается >_< Достаётся севен-зип и распаковывает экзе-шник как архив. Можно было эффективнее, но это и для новых бет или с использованием WinApi.


CreatoR [?]
У меня что то записанная строка не отображается (пустой msgbox)...
Даже не знаю, из-за чего может быть. Подумал, что из-за пробелов в путях... Но нет, с ними тоже работает нормально. Какой по счёту MsgBox? Каков ответ на первый вопрос? Сколько раз запускался экзешник? Попробуй снова скрипта скомпилировать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
SyDr [?]
Какой по счёту MsgBox?
второй.

Каков ответ на первый вопрос?
Да.

Сколько раз запускался экзешник?
2.

Попробуй снова скрипта скомпилировать.
Результат тот же :(

А что с моим вопросом, он самый важный по этой теме :blum:
[?]
Этот комплекс использует установленный в системе AutoIt, или я что-то не понял, как всё таки компилируется скрипт? И для чего 7zip?
 

SyDr

Сидра
Сообщения
651
Репутация
158
При ответе "Да" второго MsgBox'а просто не может быть ;)
Похоже моё чудо только у меня и работает. Надо исправлять :smile:

7-zip по-сути, нужен для распаковки прикрепляемого к скрипту архива. Второе: при использовании прикрепления архива есть возможность потом открывать скрипт, как sfx-архив. В моей версии к скрипту прикрпеляются два файла: архив с файлами и 7z.exe для его распаковки. Была идея дать возможность прикрпелять любое число файлов и не архивировать их. Но в этом случае размер будет больше.
Скрипт оформлен в виде UDF. Использует <File.au3> для получения имени папки в темпе.
Промежуточные данные хранятся в Data.zip.

В файле описание со скриншотами. На первые пять этапов скринов нет. Там идёт компиляция и первый запуск скрипта.

http://autoit.rv.ua/files/Other/Problem_20091107_1026.7z
 
Верх