Что нового

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

Yashied

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

Приведи пожалуйста пример в тэгах [nobbc], а то у меня чего-то не получается.

Код:
[URL=http://autoit-script.ru/index.php/topic,2849.0.html#13]"Картинки"[/URL]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
У меня вопрос по тому скрипту, в котором используется функция _LoadResourceImage(). Перед использованием функции вызывается
Код:
;...
_GDIPlus_Startup()
$hImage = _LoadResourceImage($hInstance, "PNG", "NVIDIA")
;...
А потом и в самой функции также вызывается _GDIPlus_Startup(). Получается, что GDI + инициализируется дважды?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Получается, что GDI + инициализируется дважды?

Нет, GDI+ инициализируется только один раз, все последующие вызовы игнорируются, только счетчик вызовов увеличивается на 1. С _GDIPlus_Shutdown() аналогичная ситуация, но счетчик здесь уже уменьшается на 1. Таким образом, при любом раскладе, GDI+ будет инициализирован только при первом вызове _GDIPlus_Startup(). Например:

Код:
_GDIPlus_Startup() ; Инициализация GDI+, счетчик = 1
_GDIPlus_Startup() ; счетчик = 2
_GDIPlus_Startup() ; счетчик = 3

_GDIPlus_Shutdown() ; счетчик = 2
_GDIPlus_Shutdown() ; счетчик = 1
_GDIPlus_Shutdown() ; Закрытие GDI+, счетчик = 0


Зачем я добавил это в _LoadResourceImage()? Потому что на момент вызова функции, GDI+ у кого-нибудь может быть еще не инициализирован и функция завершится с ошибкой, а если инициализирован, то ничего страшного не произойдет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Понял, большое спасибо. :IL_AutoIt_1:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
у меня чего-то не получается
Ну в этом случае лучше использовать post_13:
Код:
[url=http://autoit-script.ru/index.php/topic,2849.html#post_13]"Картинки"[/url]
почему #13 не работает я даже и не знаю :-\...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Читаем раздел "Звуки".

ВАЖНО. Я внес небольшое изменение в WinAPIEx.au3, в функцию _WinAPI_PlaySound(). Пимер из раздела "Звуки" использует именно эту версию библиотеки. Не забудьте ее обновить.

:rolleyes:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied [?]
Не забудьте ее обновить. :rolleyes:
"Скажи мне, милый ребёнок: в каком ухе у меня жужжит?"
То-то я смотрю что у меня ни в одном ухе не жужжит! ;D
 

Yashied

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

OffTopic:
Сейчас установил себе StarCraft II (StarCraft был в свое время эталоном RTS для меня), поэтому на какое-то время я пропаду из этой реальности.

:shooting2:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Даже большинство функций в Windows, предназначенных для работы с иконками, могут работать также и с иконками
:smile:
 

Yashied

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

;D
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Читаем раздел "Видео". Небольшой, но очень полезный.

:smile:
 

Yashied

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Читаем раздел "RCDATA и User-defined". Пример получился очень прикольный.

:smile:

P.S

А что, ни у кого пока не возникает вопросов?
 

sss

Продвинутый
Сообщения
332
Репутация
96
Возник следующий вопрос - как можно запихать файл любого формата в ресурс и потом сохранить его куда-нить (т.е. функцию вызывать какую-то)? Файл запихать удалось:
Код:
#Region
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, FILE.DAT, FILE, DAT, 1
#AutoIt3Wrapper_Run_After=Utilities\Upx.exe %out% --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1
#EndRegion
А вот дальше затык - пытался командой _ResourceSaveToFile - толи не понял синтаксиса, толи не работает, кароч не получается. Помогите плз!
 

Yashied

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

#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, FILE.DAT, FILE, DAT, 1

Лучше записать так:

0 или пусто - нейтральный язык

Код:
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, FILE.DAT, FILE, DAT,


Или так:

1033 - английский (США)

Код:
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, FILE.DAT, FILE, DAT, 1033


А еще лучше и проще использовать для этого AutoIt3Wrapper:

Код:
#Region
#AutoIt3Wrapper_Res_File_Add=FILE.DAT, FILE, DAT
#EndRegion


А если уж ты будешь сохранять файл на диск, то для этого вообще ресурсы не нужны. Все делается с помощью функции FileInstall().

Но можно и так:

Код:
#Include <WinAPIEx.au3>

#Region
#AutoIt3Wrapper_Res_File_Add=FILE.DAT, FILE, DAT
#EndRegion

; Извлекаем файл из ресурсов
$tData = _LoadResourceData(_WinAPI_GetModuleHandle(0), "FILE", "DAT")

; Записываем файл на диск в MyFile.dat
$hFile = FileOpen(@ScriptDir & '\MyFile.dat', 2 + 16)
FileWrite($hFile, Binary(DllStructGetData($tData, 1)))
FileClose($hFile)

Func _LoadResourceData($hInstance, $sResType, $sResName, $iResLanguage = 0)

    Local $hInfo, $hData, $pData, $iSize

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
    $hData = _WinAPI_LoadResource($hInstance, $hInfo)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, "")
    EndIf
    Return SetError(0, $iSize, DllStructCreate("byte[" & $iSize & "]", $pData))
EndFunc   ;==>_LoadResourceData


Тоже самое, но только на WinAPI (я не рекомендую использовать нативные AutoIt функции File... для работы с двоичными файлами):

Код:
#Include <WinAPIEx.au3>

#Region
#AutoIt3Wrapper_Res_File_Add=FILE.DAT, FILE, DAT
#EndRegion

Global $Bytes

; Извлекаем файл из ресурсов
$tData = _LoadResourceData(_WinAPI_GetModuleHandle(0), "FILE", "DAT")

; Записываем файл на диск в MyFile.dat
$hFile = _WinAPI_CreateFile(@ScriptDir & "\MyFile.dat", 1, 4)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tData), DllStructGetSize($tData), $Bytes)
_WinAPI_CloseHandle($hFile)

Func _LoadResourceData($hInstance, $sResType, $sResName, $iResLanguage = 0)

    Local $hInfo, $hData, $pData, $iSize

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
    $hData = _WinAPI_LoadResource($hInstance, $hInfo)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, "")
    EndIf
    Return SetError(0, $iSize, DllStructCreate("byte[" & $iSize & "]", $pData))
EndFunc   ;==>_LoadResourceData
 

sss

Продвинутый
Сообщения
332
Репутация
96
Yashied огромное спасибо! Очень полезная инфа!

Вчера ночью посидел, подумал и сделал работающий скрипт, но с использованием ResHacker. Т.е. я его FileInstall'ом засунул в скрипт и потом давал ему команду сохранить ресурс из dll, который он сам сгенерил) Твой скрипт намного лучше, спасибо огромное.
 

sss

Продвинутый
Сообщения
332
Репутация
96
Опять возник вопрос - при запихивании FileInstall'ом большого файла (1,5гб) иконка скомпилированого скрипта пропадает и он не запускается. Можно ли реализовать это (можно и другими способами)?
 
Верх