Автор Тема: Сохранить файл атласов из текущего визуального стиля  (Прочитано 146 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 194
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем доброго.
Хочу сохранить ресурс из DLL-ки в файл. В частности, это PNG и тип данных нестандартный. Загружаю этот ресурс в память, а сохранить не знаю как:
Код: AutoIt [Выделить]
Local $hInstance = _WinAPI_LoadLibraryEx("C:\Users\music\Desktop\Autumn Dreams\Autumn Dreams.msstyles", $LOAD_LIBRARY_AS_DATAFILE)
Local $hResource = _WinAPI_FindResource($hInstance, 'STREAM', 1157)
Local $iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
Local $hData = _WinAPI_LoadResource($hInstance, $hResource)
Local $pData = _WinAPI_LockResource($hData)
ConsoleWrite('$hInstance: ' & $hInstance & ', $hResource: ' & $hResource & ', $iSize: ' & $iSize & ', $hData: ' & $hData & ', $pData: ' & $pData & @CR)
 


Это библиотека ресурсов визуального стиля, мне нужно сохранить изображение из «папки» STREAM под индексом 1157. Плиз хэлп...
« Последнее редактирование: Октябрь 13, 2018, 14:20:25 от musicstashall »

Русское сообщество AutoIt


Помечен как лучший ответ пользователем musicstashall Отправлен Октябрь 13, 2018, 12:24:14

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3939
  • Репутация: 1043
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #1, Отправлен: Октябрь 12, 2018, 17:22:22 »
В справке по функции _WinAPI_LockResource() есть пример сохранения в jpg.
Я взял этот пример и сохранил в png ресурс 'STREAM', 971 из стандартной для Win7 aero.msstyles
Просто добавил к вашему скрипту код из примера
Код: AutoIt [Выделить]
Local $hFile = FileOpen("test.png", 2 + 16)
Local $tData = DllStructCreate('byte[' & $iSize & ']', $pData)
FileWrite($hFile, DllStructGetData($tData, 1))
FileClose($hFile)


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 194

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #2, Отправлен: Октябрь 12, 2018, 17:38:55 »
Ух-ты! Креативно.


Добавлено: Октябрь 12, 2018, 19:00:27
Дружище, а что, получается, что подобным образом можно создавать в памяти структуры и сохранять их в DLL??
« Последнее редактирование: Октябрь 12, 2018, 19:00:27 от musicstashall, Причина: Объединение сообщений »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3939
  • Репутация: 1043
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #3, Отправлен: Октябрь 12, 2018, 19:26:06 »
musicstashall  [?]
Цитировать
можно создавать в памяти структуры и сохранять их в DLL?
Не знаю. Никогда этим не занимался.

Русское сообщество AutoIt

Re: Сохранить ресурс в файл из DLL
« Ответ #3 Отправлен: Октябрь 12, 2018, 19:26:06 »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 194

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #4, Отправлен: Октябрь 13, 2018, 07:45:05 »
Теперь вопрос посложнее. Сохранили мы файл атласов, теперь надо получить его разметку $TMT_ATLASRECT, $TMT_SIZINGMARGINS, $TMT_CONTENTMARGINS. Должно получиться что-то подобное этому:
(нажмите для показа/скрытия)

То ли я нашел: GetThemeStream
Пробую что-то, сам не понимаю:
Код: AutoIt [Выделить]
#include <WinAPITheme.au3> 
#include <APIThemeConstants.au3>
Local $hTheme = _WinAPI_OpenThemeData (0, 'DWMWINDOW'), $rect
For $i = 1 To 91
    $rect = _WinAPI_GetThemeRect($hTheme, $i, 0, $TMT_ATLASRECT)
    ConsoleWrite(DllStructGetData($rect, 1) &',' & DllStructGetData($rect, 2) &',' & DllStructGetData($rect, 3) &',' & DllStructGetData($rect, 4) & @CR)
Next
 

Вроде бы получаю какие-то похожие данные, но не знаю, то это или не то. И это из текущей темы получаем, а надо бы еще из файла.
Или лучше создать отдельную тему по данным .msstyles? Так то у меня много планов по нему ;)



Добавлено: Октябрь 13, 2018, 08:58:12
Разобрался с первой секцией TMT_ATLASRECT
Код: AutoIt [Выделить]
Local $hTheme = _WinAPI_OpenThemeData (0, 'DWMWINDOW')
Local $rect = _WinAPI_GetThemeRect($hTheme, 0, 0, $TMT_ATLASRECT), $rect, $string
ConsoleWrite('# Rects' & @CR & '# 8002 = TMT_ATLASRECT' & @CR)
For $i = 1 To 99
    $rect = _WinAPI_GetThemeRect($hTheme, $i, 0, $TMT_ATLASRECT)
    $string = DllStructGetData($rect, 1) &',' & DllStructGetData($rect, 2) &',' & DllStructGetData($rect, 3) &',' & DllStructGetData($rect, 4) 
    ConsoleWrite($i & ';0;' & $TMT_ATLASRECT & '=' & $string & @CR)
Next
ConsoleWrite('# Margins' & @CR & '# 3601 = TMT_SIZINGMARGINS' & @CR & '# 3602 = TMT_CONTENTMARGINS' & @CR)
 


А вот с двумя другими не получается:

Код: AutoIt [Выделить]
ConsoleWrite('# Margins' & @CR & '# 3601 = TMT_SIZINGMARGINS' & @CR & '# 3602 = TMT_CONTENTMARGINS' & @CR)
For $i = 1 To 99
    $rect = _WinAPI_GetThemeRect($hTheme, $i, 0, $TMT_SIZINGMARGINS)
    $string = DllStructGetData($rect, 1) &',' & DllStructGetData($rect, 2) &',' & DllStructGetData($rect, 3) &',' & DllStructGetData($rect, 4)
    ConsoleWrite($i & ';0;' & $TMT_SIZINGMARGINS & '=' & $string & @CR)
    $rect = _WinAPI_GetThemeRect($hTheme, $i, 0, $TMT_CONTENTMARGINS)
    $string = DllStructGetData($rect, 1) &',' & DllStructGetData($rect, 2) &',' & DllStructGetData($rect, 3) &',' & DllStructGetData($rect, 4)
    ConsoleWrite($i & ';0;' & $TMT_CONTENTMARGINS & '=' & $string & @CR)
Next
 


Вот оригинал, как бы:
(нажмите для показа/скрытия)

Например, в оригинале значение: 1;0;3602=0,4294967294,11,4294967291
А у меня: 1;0;3602=0,-2,11,-5
« Последнее редактирование: Октябрь 13, 2018, 09:24:18 от musicstashall »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3939
  • Репутация: 1043
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #5, Отправлен: Октябрь 13, 2018, 12:51:18 »
musicstashall  [?]
Цитировать
Теперь вопрос посложнее
Это конкурс или собеседование? ;D

Цитировать
Например, в оригинале значение: 1;0;3602=0,4294967294,11,4294967291
А у меня: 1;0;3602=0,-2,11,-5
Это разный тип данных - со знаком и без
(нажмите для показа/скрытия)

Функция _WinAPI_GetThemeRect() использует $tagRECT, которая описана через long. Поэтому, здесь два варианта.
1. Описать собственную структуру через ulong
Код: AutoIt [Выделить]
Const $tagRECT_UL = "ulong Left;ulong Top;ulong Right;ulong Bottom"

и переписать функцию _WinAPI_GetThemeRect: заменить $tagRECT на $tagRECT_UL.

2. Конвертировать результат оригинальной функции из long в ulong
Код: AutoIt [Выделить]
; результат работы _WinAPI_GetThemeRect
$tRECT = DllStructCreate("long Left;long Top;long Right;long Bottom")
$tRECT.Left = 0
$tRECT.Top = -2
$tRECT.Right = 11
$tRECT.Bottom = -5
ConsoleWrite($tRECT.Left &","& $tRECT.Top &","& $tRECT.Right &","& $tRECT.Bottom & @CRLF) ; 0,-2,11,-5

; конвертация
$tagRECT_UL = "ulong Left;ulong Top;ulong Right;ulong Bottom"
$tUL = DllStructCreate($tagRECT_UL, DllStructGetPtr($tRECT))
ConsoleWrite($tUL.Left &","& $tUL.Top &","& $tUL.Right &","& $tUL.Bottom & @CRLF) ; 0,4294967294,11,4294967291


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 194

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Сохранить ресурс в файл из DLL
« Ответ #6, Отправлен: Октябрь 13, 2018, 14:11:04 »
Вонана што  :laugh:

Благодарю

Русское сообщество AutoIt

Re: Сохранить ресурс в файл из DLL
« Ответ #6 Отправлен: Октябрь 13, 2018, 14:11:04 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
19 Ответов
6429 Просмотров
Последний ответ Ноябрь 14, 2010, 20:07:10
от madmasles
2 Ответов
3619 Просмотров
Последний ответ Август 06, 2011, 20:50:02
от WSWR
0 Ответов
1662 Просмотров
Последний ответ Февраль 18, 2013, 18:25:52
от BadVolt
2 Ответов
1816 Просмотров
Последний ответ Октябрь 02, 2013, 02:55:04
от urrya
5 Ответов
1630 Просмотров
Последний ответ Май 31, 2014, 03:20:33
от Z_Lenar
6 Ответов
3067 Просмотров
Последний ответ Июль 28, 2014, 20:56:33
от alex33
9 Ответов
2217 Просмотров
Последний ответ Январь 25, 2015, 21:45:27
от Yashied
3 Ответов
2183 Просмотров
Последний ответ Апрель 10, 2015, 20:01:28
от Yashied
1 Ответов
785 Просмотров
Последний ответ Апрель 06, 2017, 10:19:48
от joiner
3 Ответов
1943 Просмотров
Последний ответ Сентябрь 02, 2017, 06:45:03
от Hiki