Что нового

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

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Sky-WaLkeR сказал(а):
Опять возник вопрос - при запихивании FileInstall'ом большого файла (1,5гб) иконка скомпилированого скрипта пропадает и он не запускается. Можно ли реализовать это (можно и другими способами)?

Просто положить файл рядом со скриптом и использовать FileCopy.
Если есть желание можно запаковать в самораспаковывающийся архив WinRAR'ом или 7zip.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Хороший мануал получается.

Может быть добавить в раздел "Структуры" упоминание о выравнивании?

Код:
$t1 = DllStructCreate("long val1;double val2")
ConsoleWrite('-> Size $t1=' & DllStructGetSize($t1) & @CRLF)

$t2 = DllStructCreate("align 2;long val1;double val2")
ConsoleWrite('-> Size $t2=' & DllStructGetSize($t2) & @CRLF)


Просто сам, недавно наскочил на этот пень.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А причем здесь выравнивание? Оно нужно далеко не всегда, а там где нужно, об этом сказано в MSDN.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
А причем здесь выравнивание?

Примерно так:

ВАЖНО. При создании структуры всегда очень аккуратно перечисляйте типы данных, хорошо представляя, сколько каждый из них требует памяти и в какой последовательности они должны располагаться в структуре.

$tStruct = DllStructCreate("int;int")

Здесь создается структура, состоящая из двух последовательно расположенных элементов целочисленного знакового типа INT. Посмотрев в таблицу допустимых типов, вы увидите, что тип INT требует для хранения данных всего 4 байта памяти. Как нетрудно догадаться, размер всей структуры будет равен 4 * 4 = 8 байт.

в моем примере создается структура из переменной типа long (4 байта) и переменной типа double (8 байт).
Мне нетрудно было догадаться, что размер всей структуры будет равен 4 +8 = 12 байт, а с выравниванием по умолчанию получается не 12, а 16 байт.

Для меня это стало

причиной ряда "необъяснимых" ошибок
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Еще раз, необходимость выравнивания зависит от конкретной API функции, о чем должно быть сказано в MSDN. Более того, в большинстве случаев выравнивание зависит еще и от разрядности ОС. Не думаю, что здесь нужно об этом говорить. Это сильно усложнит и без того не самый легкий материал.
 

sss

Продвинутый
Сообщения
332
Репутация
96
dwerf, мне хочется запихнуть етот файл в сам файл скрипта и из него потом извлекать. Под другими вариантами я имел ввиду связку с ResHacker'ом и файлом dll. У мну так тоже не получилось - РесХакер зависал при добавлении ресурса ). А схема проверенная - уже делал так с мелкими файлами, а с большим не получается.
 

Yashied

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

sss

Продвинутый
Сообщения
332
Репутация
96
Yashied, а можно поподробнее, как можно дописать свой файл (это, кстати говоря, архив rar) в конец exe-файла? И потом его прочитать (с условием, что читаться он будет консольным rarom или 7-zip'ом)?
 

Yashied

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

Код:
#Include <WinAPI.au3>

Global Const $sExe = @ScriptDir & '\MyProg.exe'
Global Const $sRar = @ScriptDir & '\MyData.rar'

Global Const $iBuf = 80 * 1024 * 1024 ; 80 Мб (можно и больше)

Global $iBytes

$tData = DllStructCreate('byte[' & $iBuf & ']')
$pData = DllStructGetPtr($tData)
$tSize = DllStructCreate('dword', $pData)
$iSize = FileGetSize($sRar)
$iMod = Mod($iSize, $iBuf)
$iPart = ($iSize - $iMod) / $iBuf
$hData = _WinAPI_CreateFile($sRar, 2, 2)
$hFile = _WinAPI_CreateFile($sExe, 2, 4)
_WinAPI_SetFilePointer($hFile, 0, $FILE_END)
For $i = 1 To $iPart + 1
	If $i > $iPart Then
		_WinAPI_ReadFile($hData, $pData, $iMod, $iBytes)
	Else
		_WinAPI_ReadFile($hData, $pData, $iBuf, $iBytes)
	EndIf
	If @error Then
		; ???
	EndIf
	If $i > $iPart Then
		_WinAPI_WriteFile($hFile, $pData, $iMod, $iBytes)
	Else
		_WinAPI_WriteFile($hFile, $pData, $iBuf, $iBytes)
	EndIf
	If @error Then
		; ???
	EndIf
Next
DllStructSetData($tSize, 1, $iSize)
_WinAPI_WriteFile($hFile, $pData, 4, $iBytes)
If @error Then
	; ???
EndIf
_WinAPI_CloseHandle($hFile)
_WinAPI_CloseHandle($hData)

$tData = 0


Сама программа (MyProg.exe) будет выглядеть примерно так:

Код:
#Include <WinAPI.au3>

Global Const $sExe = @ScriptFullPath
Global Const $sRar = @ScriptDir & '\MyData_New.rar'

Global Const $iBuf = 80 * 1024 * 1024 ; 80 Мб (можно и больше)

Global $iBytes

$tData = DllStructCreate('dword')
$pData = DllStructGetPtr($tData)
$hFile = _WinAPI_CreateFile($sExe, 2, 2)
_WinAPI_SetFilePointer($hFile, -4, $FILE_END)
_WinAPI_ReadFile($hFile, $pData, 4, $iBytes)
If @error Then
	; ???
EndIf
$iSize = DllStructGetData($tData, 1)
$tData = DllStructCreate('byte[' & $iBuf & ']')
$pData = DllStructGetPtr($tData)
$iMod = Mod($iSize, $iBuf)
$iPart = ($iSize - $iMod) / $iBuf
$hData = _WinAPI_CreateFile($sRar, 1, 4)
_WinAPI_SetFilePointer($hFile, -(4 + $iSize), $FILE_END)
For $i = 1 To $iPart + 1
	If $i > $iPart Then
		_WinAPI_ReadFile($hFile, $pData, $iMod, $iBytes)
	Else
		_WinAPI_ReadFile($hFile, $pData, $iBuf, $iBytes)
	EndIf
	If @error Then
		; ???
	EndIf
	If $i > $iPart Then
		_WinAPI_WriteFile($hData, $pData, $iMod, $iBytes)
	Else
		_WinAPI_WriteFile($hData, $pData, $iBuf, $iBytes)
	EndIf
	If @error Then
		; ???
	EndIf
Next
_WinAPI_CloseHandle($hFile)
_WinAPI_CloseHandle($hData)

$tData = 0


Последние 4 байта в MyProg.exe, есть размер добавленного .rar файла (максимум 4 Гб, т.е. размер DWORD). Сам .rar начинается в MyProg.exe с адреса:

размер exe - размер rar - 4

или просто

-(размер rar + 4),

начиная с конца файла.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Небольшое замечание к FAQ по картинкам
Код:
#AutoIt3Wrapper_Run_After=Upx.exe %out% --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1

не работает, если в названии папок, где находится скрипт есть пробел, решил кавычками
Код:
#AutoIt3Wrapper_Run_After=Upx.exe "%out%" --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1

И еще одно(долго копался пока не нашел причину), если название ресурса состоит только из цифр
Код:
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, res.png,  PNG, 100,

То и обращаться к нему нужно как к цифре(без кавычек) иначе не работает.
Код:
$hImage = _LoadResourceImage($hInstance, 'PNG', 100)
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Sky-WaLkeR сказал(а):
при запихивании FileInstall'ом большого файла (1,5гб) иконка скомпилированого скрипта пропадает
Это известный баг винды. У больших файлов не отображаются иконки.

У меня другой вопрос: реально ли поместить в ресурсы библиотеку DLL и работать с ней не извлекая?
 

Yashied

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

Нет.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Особенности языка AutoIt?
Потому, что встречал кейгены, у которых в ресурсах лежала BASS.DLL и воспроизводила трекерную музыку.
 

Yashied

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

Нет, особенности DLL.

ynbIpb сказал(а):
Особенности языка AutoIt?
Потому, что встречал кейгены, у которых в ресурсах лежала BASS.DLL и воспроизводила трекерную музыку.

Теоретически это сделать нельзя, но есть умельцы, которые частично реализуют это, но оно того едва ли стоит. Необходимо перехватывать ряд системных функций, например GetModuleHandle() и др., которые используются конкретно в данной DLL.
 

Димон

Новичок
Сообщения
42
Репутация
0
Добрый вечер! Напишите,как лучше всего получить имя файла программы для использования вместо File_Name ?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
MsgBox(0,"",@ScriptName)

В справку никак было заглянуть?
 

Димон

Новичок
Сообщения
42
Репутация
0
Спасибо! Я пару дней скачал аутоит,еще не разобрался.Я хочу в скрипт вписать "адрес " проги.

Честно говоря,я не понял. Читаю справку.

Прошу прощения,мы,должно быть,друг друга не поняли.Я вставил то в ,,скрипт,, ,результата не получил,естествено,верней получил,но совсем не тот.Справку читал как говорится вдоль и поперек,2 раза часа по полтора,устал,ничего не понял.Примеры делал.
Короче,я сечас процитирую,что я хотел,а то сто пудов я очень плохо расказал.

Вот:

Код:
Код:
AutoItSetOption ("WinTitleMatchMode", -2)

$state = WinGetState ("MetaTrader", "")

If $state > 0  Then
	MsgBox (0, "Сообщение AutoIt", "Программа уже запущена")
Exit

Else
	Run ( "File_Name", "", @SW_HIDE)
EndIf
Exit


То же самое, вставляете в Блокнот, меняете File_Name на имя файла программы (НЕ заголовок), сохраняете с расширением au3, потом идете в меню Пуск, в папке ярлычков AutoIT запускаете компилятор скриптов (называется Compile Script to .exe), компилируете скрипт в исполнимый файл (проще говоря, делаете из файла au3 программу), кладете его в папку с программой, а ярлык на него - в автозапуск.

Чтто же такое и как его получить,это имя файла программы???Где взять его??
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Димон
Код:
If ProcessExists("notepad.exe")  Then
	MsgBox(0, "Сообщение AutoIt", "Программа уже запущена")
	Exit
Else
   Run("notepad.exe")
EndIf

Или
Код:
_Check()
Sleep(3000)
_Check()

Func _Check() ; as void
	$iPID = WinGetProcess("MetaTrader")
	$aList = ProcessList()
	For $i = 1 To $aList[0][0]
		If $aList[$i][1] = $iPID Then 
			MsgBox(0, "Сообщение AutoIt", "Программа ( " & $aList[$i][0] & " ) уже запущена")
			Exit
		EndIf			
	Next
	Run("MetaTrader.exe")
EndFunc ;==>_Check
 

Димон

Новичок
Сообщения
42
Репутация
0
Спасибо! Читаю.Щас попробую.А то так непонятно.

Спасибо! Чуть позже отпишусь падробней, мне скоро в школу,тут недалеко. Схожу на пару уроков,а то біваю редко.Как ві узнали,что прога Run("MetaTrader.exe")????
 
Верх