Что нового

Обсуждение FAQ'а по использованию ресурсов в AutoIt

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Димон

Хватит плодить сообщения одно под другим. Просто добовляй в предыдущее (кнопка редактировать).

P.S

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

Dizel933

Новичок
Сообщения
9
Репутация
2
Скажите пожалуйста как сделать чтоб действие, при виде определённого окна, повторялось
 

agikon

Знающий
Сообщения
789
Репутация
17
прочитал вот эту http://autoit-script.ru/index.php/topic,2849.0.html#post_13 тему и с надеждой что смогу добавлять картинки в программу и так ничего и не понял. Я уже умею добавлять иконки и для интереса прочитал с этой статти и на удивление выявил для себя что если бы я учился с этой статти то так и не понял бы как же добавлять те иконки.
Вобщем как новичек могу сказать что стаття хорошая но чисто теория, а вот практики в ней 0. Хотелось бы чтобы было больше конкретики, я вот прочитал всё а делать всё-равно ничего не могу.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
agikon сказал(а):
...а вот практики в ней 0.

В каждой теме есть "разжеванные" примеры + скриншоты на ресурсы и результат работы кода. Какая еще практика нужна? Что непонятно, спрашивай.
 

agikon

Знающий
Сообщения
789
Репутация
17
Yashied , меня на этом форуме научили как заменить стандартную иконку на свою.
мне сказали примернл следующее: Запусти программу AutoIt3Wrapper_Gui.exe и открой нею свой скрипт, а потом и в поле Icon выбери свою иконку и скомпилируй. Вот это я сделал и всё тут ясно.
Теперь прочитайте тему про иконки здесь http://autoit-script.ru/index.php/topic,2849.0.html#post_12. Да тут много написано полезной теории но я раз 5 прочитал так и не понял как по вашему способу заменить эту иконку, хотя я и до этого уже знал как.
Дело в том что вы описываете чисто теорию без малейшего намёка на практику, мне это напомнило басню про то как лисица журавля молоком с блюдечка угощала :smile:

запускал я и AutoIt3Wrapper_Gui.exe ничего подобного в нём не нашел. Потом запустил прогу ресурсе хакер и опять ничего не понял, ибо как раз папки Bitmap в списке моего экзешника не оказалось.а у вашей статти уже всё готовоё и кто его знает как оно там оказалось.
От смотрите у вас уже есть папка Bitmap http://postimage.org/image/36timxhs4/ я тоже открыл свой экзешник этим ресурсе хакером и папки Bitmap нет,
Я конечно не имею морального права судить так как не сделал для аутоита ничего, но просто как новичек от так мне показалось.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Обсуждение FAQ\'а по использованию ресурсов в AutoIt

В таком случае, вам нужно немного больше узнать о ресурсах в целом, и о том, как и где они располагаются в исполняемом модуле в частности. Без этого, дальше замены иконки вам будет очень сложно продвинуться. Согласитесь, для того, чтобы говорить об умножении, необходимо сначала разобраться в сложении и т.д. Я писал статью для того, чтобы те, кто будет ее читать, сами могли разобраться в предложенном материале и самое главное, смогли бы применить его для своих задач. Естественно, читатель должен обладать базовыми знаниями о ресурсах, хотя бы на уровне программы Resource Hacker или Restorator.

Писать что-то типа нажмите "Выбрать..." - выберете иконку - нажмите "OK" (aka User Guide) я целью для себя не ставил. А уровень сложности данной статьи основан на могочисленных вопросах, которые я проанализировал до того, как начать что-то писать.


Добавлено:
Сообщение автоматически объединено:

Приведите пример того, что вы уже написали для добавления картинки. Я посмотрю...
 

eil

Новичок
Сообщения
53
Репутация
0
спасибо за очень полезный FAQ! :ok:
по теме иконок, о которой тут выше шёл разговор - как по мне то все(ну или все что мне пока было надобно) описано доступно и понятно. ;)
впрочем остались 2 момента.
1- в поисках темы про добавление иконок набрёл не только на вашу статью, но и на другие источники, и вот там почерпнул некоторую необязательную, но думаю весьма полезную информацию = о том, что autoit при компиляции вставляет несколько своих ресурсов которые потом не нужны и только занимают место. в faq упомянуты некоторые из них, но не эти:
Код:
#AutoIt3Wrapper_Run_After=Utilities\ResHacker.exe -delete %out%, %out%, Dialog, 1000, 
#AutoIt3Wrapper_Run_After=Utilities\ResHacker.exe -delete %out%, %out%, Menu, 166,

хотелось бы узнать ваше мнение по поводу их удаления. + предложить= может стоило бы тоже гдето упомянуть о них. 8)

2- по всему форуму при вопросе о FileInstall() просто говорят что использование легко, и отправляют к help файлу. но ни в help файле, ни на этом ни на официальном форумах, нигде(ну или я уж совсем плох в поиске стал), нет нормальной инструкции "Как добавить файл(exe, ini) по тому же формату что с помощью ResHack(c добавлением своих категорий, а не в RCDATA) и как потом к ним обращаться для распаковки?(ясно что с @FullScriptPath, но имя то и категорию как указывать?)". к слову слову, если кто может ответить, буду благодарен, и так же предлагаю, что может стоило бы это осветить примерчиков в FAQ(поскольку там примеры не "только одним методом", то это была бы полезная информация). :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
eil сказал(а):
...autoit при компиляции вставляет несколько своих ресурсов которые потом не нужны и только занимают место.

Я собирался об этом написать в разделе "Ресурсы AutoIt", но пока все никак руки не доходят. Если в кратце, то AutoIt добавляет следующие ресурсы:

Menu\166
Это умолчальное меню в трее ("Script Paused" и "Exit"). Если вы его не используете (TrayMenuMode = 1) или не выводите иконку в трее (#NoTrayIcon), то можете смело удалять этот ресурс.

Dialog\1000
Используется только в функции InputBox() для формирования диалогового окна. Если вы не используете эту функцию, то можете избавиться от этого ресурса.

String\*
Нужны для разнообразных сообщений при возникновении ошибок. Не советую трогать этот ресурс, т.к. можете получить неработоспособную программу.

Icon\99 (AutoIt 3.3.6.1)
Это основная иконка программы которая будет отображаться в панели задач и во всех создаваемых окнах (по умолчанию). Если вы не создаете никаких окон, то можете удалить ее из ресурсов или поменять на свою собственную иконку. Директива #AutoIt3Wrapper_Icon именно это и делает. Однако, если эта иконка все же используется, то во избежании всяких непоняток необходимо сохранить за ней индекс 99.

Icon\162, Icon\164
Используются в умолчальном меню в трее. Опять же, если это меню не выводится, то можно от них избавиться.

Icon\169
Отображается в ListView созданном функцией GUICtrlCreateListView() при перетаскивании элементов мышкой. Если это не нужно, а скорее всего так оно и есть, то можете удалить эту иконку из ресурсов. Для полного счастья можно еще добавить в код следующее:

Код:
...

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

...

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

	Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
	Local $hLV = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
	Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')

	Switch $hFrom
		Case $hListView
			Switch $ID
				Case $LVN_BEGINDRAG
					Return 0
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Version\1
Информация о программе. Если это не нужно, можете удалить.

Manifest\1
Файл манифеста. Если вам не нужны стили Windows и другие установки в манифесте, то можете удалить его.

eil сказал(а):
Как добавить файл(exe, ini) по тому же формату что с помощью ResHack(c добавлением своих категорий, а не в RCDATA) и как потом к ним обращаться для распаковки?(ясно что с @FullScriptPath, но имя то и категорию как указывать?).

См. "RCDATA и User-defined". Я там очень подробно написал про это. Прочитайте несколько раз.
 

eil

Новичок
Сообщения
53
Репутация
0
Я собирался об этом написать в разделе "Ресурсы AutoIt", но пока все никак руки не доходят. Если в кратце, то AutoIt добавляет следующие ресурсы:
так вот ниже вы уже все и описали вроде бы :smile: так можно было бы и добавить.
Для полного счастья можно еще добавить в код следующее:
я недавно познакомился с autoit, поэтому ничего не понял в этом коде ;D рановато мне такое.
Я там очень подробно написал про это. Прочитайте несколько раз.
наверно я чегото не вижу.. :scratch: потому что вижу только способ обращения к вшитым при компиляции ресурсам через WinAPI функции, которые я вобще не хочу использовать, учитывая что есть FileInstall(). (но нет примеров использования его с @ScriptFullPath)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вы просто не монимаете смысл функции FileInstall(). Она играет двойную роль. Во время компиляции скрипта, FileInstall() выступает в роли директивы. Компилятор, если встречает в коде вызов этой функции, помещает указанный в первом параметре файл в тело .exe файла. Во время выполнения программы, вызов FileInstall() просто записывает, уже находящийся в исполняемом модуле, файл по пути, указанному во втором параметре. Вот и все. Отсюда и ограничение, что нельзя использовать любые переменные для указания файла источника, т.к. на момент компиляции переменные еще не инициализированы, и компилятор не будет знать какой файл необходимо взять. Другими словами, с помощью FileInstall() можно распаковать только действительный файл, и она никоем образом не работает с ресурсами.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
eil,
Добавлю свои "пять копеек" про FileInstall(). :smile:
Функцию можно использовать по условию, то есть с ее помощью внедрить в тело exe-файла несколько файлов, а распаковываться они уже будут только при совпадении заданных условий. Вот простой пример:
Код:
#include <File.au3>

HotKeySet('3', '_My_Install');нажать 3 - посмотреть день недели.
HotKeySet('{Esc}', '_Exit');нажать Esc - выход

While 1
	Sleep(50)
WEnd

Func _My_Install()
	;файлы 1.txt - 7.txt должны быть в папке со скриптом при компиляции
	Local $s_Text, $s_FileName = _TempFile()
	HotKeySet('3')
	Switch @WDAY
		Case 1
			FileInstall('1.txt', $s_FileName, 1)
		Case 2
			FileInstall('2.txt', $s_FileName, 1)
		Case 3
			FileInstall('3.txt', $s_FileName, 1)
		Case 4
			FileInstall('4.txt', $s_FileName, 1)
		Case 5
			FileInstall('5.txt', $s_FileName, 1)
		Case 6
			FileInstall('6.txt', $s_FileName, 1)
		Case 7
			FileInstall('7.txt', $s_FileName, 1)
	EndSwitch
	$s_Text = FileRead($s_FileName)
	FileDelete($s_FileName)
	MsgBox(64, 'Info', 'Сегодня: ' & $s_Text)
	HotKeySet('3', '_My_Install')
EndFunc   ;==>_My_Install

Func _Exit()
	Exit
EndFunc   ;==>_Exit
В прикрепленном архиве файлы 1.txt - 7.txt и сам скрипт.
 

eil

Новичок
Сообщения
53
Репутация
0
после обоих ответов, все еще не до конца понимая, высказываю предположение: варианта
Код:
FileInstall(@ScriptDir &"\Resources\rar.exe", @TempDir &"\rar.exe", 0)
вполне достаточно = при разработке скрипта будет использоваться файл из Resources, а после компиляции прога сама будет вместо первого параметра брать файл из себя, и все так же "распаковывать" в Temp.
верно?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
eil [?]
высказываю предположение: варианта
Неправильное предположение, прочитайте еще раз пост Yashied`a и посмотрите мой код.
 

eil

Новичок
Сообщения
53
Репутация
0
именно слова из его поста и натолкнули меня на такую мысль, а ваш пример вроде бы подтвердил ее(правда я не понял зачем использовать как второй параметр функцию -к чему это усложнение?).
Компилятор, если встречает в коде вызов этой функции, помещает указанный в первом параметре файл в тело .exe файла. Во время выполнения программы, вызов FileInstall() просто записывает, уже находящийся в исполняемом модуле, файл по пути, указанному во втором параметре.
как я и говорил= до компиляции файл используется из указанного в первом параметре места, а после компиляции файл берется из самой проги и просто распаковывается по пути в параметре 2. разве та строка не будет работать, согласно такому принципу?!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
eil,
Вы попробуйте скомпилировать Ваш вариант.
я не понял зачем использовать как второй параметр функцию -к чему это усложнение?
Для того, чтобы точно знать, что имя файла уникально и при распаковке не будет затерт какой-либо чужой файл.
 

eil

Новичок
Сообщения
53
Репутация
0
попробывал. работает если исправить на
Код:
FileInstall("rar.exe", @TempDir &"\rar.exe", 0)
само собой при условии что rar.exe рядом(и дальше по коду он будет из Temp удален). как мне кажется последние 2 раза я правильно(возможно просто не точно "по терминам") описывал(предполагал) механизм работы.
в общем похоже я разобрался ;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
eil

Грубо говоря, во время компиляции вашего скрипта компилятор заменит эту строчку

Код:
FileInstall("C:\Resources\rar.exe", @TempDir & "\rar.exe")


на такую

Код:
FileWrite(@TempDir & "\rar.exe", Binary("0x4D5A9000..."))


где "0x4D5A9000..." - данные из файла rar.exe.

@ScriptDir работает только во время выполнения программы, а во время компиляции он вообще не существует. Поэтому в первом параметре FileInstall() нужно указывать только статический путь без всяких там @Script... Второй параметр может быть какой угодно, поскольку он будет обрабатываться во время выполнения скрипта.

Первый параметр лишь указывает компилятору какой файл нужно запихнуть в .exe. После того, как скрипт скомпилирован, этот параметр уже не используется.
 

Free_Soft

Новичок
Сообщения
4
Репутация
0
Если уже проскакивало, прошу прощения, поиском не нашел. А как использовать картинку (желательно, PNG) из ресурсов для SplashImageOn?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Посмотрите в этой теме:
http://autoit-script.ru/index.php/topic,2849.0.html#post_13
 
Верх