<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=12420</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=12420&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSC: Script Component для чтения ресурсов из файлов через res протокол».]]></description>
		<lastBuildDate>Wed, 01 Mar 2017 15:42:16 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=113493#p113493</link>
			<description><![CDATA[<p><strong>Flasher</strong>, мда. Скайп не панацея. )</p><p><strong>mozers</strong>, решил ещё подробнее поковырять &quot;тело иконок&quot;. И тут заметил - в заголовке тела иконки имеем:<br /></p><div class="quotebox"><blockquote><p>typedef struct tagBITMAPINFOHEADER {<br />&nbsp; DWORD biSize;<br />&nbsp; LONG&nbsp; biWidth;<br />&nbsp; LONG&nbsp; biHeight;<br />&nbsp; WORD&nbsp; biPlanes;<br />&nbsp; WORD&nbsp; biBitCount;<br />&nbsp; DWORD biCompression;<br />&nbsp; DWORD biSizeImage;<br />&nbsp; LONG&nbsp; biXPelsPerMeter;<br />&nbsp; LONG&nbsp; biYPelsPerMeter;<br />&nbsp; DWORD biClrUsed;<br />&nbsp; DWORD biClrImportant;<br />} BITMAPINFOHEADER, *PBITMAPINFOHEADER;</p></blockquote></div><p>А раз так, то этого вполне достаточно для составления заголовка иконки. Вот и переделал Ваш код слегка. Благодаря вашей заготовке разобрался с offset. Внёс следующие изменения:<br />1) Вместо XMLHTTP использовал CDO.Message <br />2) Переделал чтение группы иконок. Решил, что собирать весь заголовок по байтам накладно, поэтому сделал его блочное чтение из ресурсов, что подсократило код и количество вызовов &quot;Write&quot;<br />3) Для отдельных иконок стал собирать информацию из BITMAPINFOHEADER, который содержится в теле ресурса иконки</p><div class="codebox"><pre><code>
Option Explicit
Dim oResReader
Set oResReader = new cResReader
oResReader.Open &quot;shell32.dll&quot;

On Error Resume Next
With oResReader
	SaveToFile .ReadIcon(&quot;1&quot;), &quot;ICON1.png&quot;
	SaveToFile .ReadIcon(&quot;2&quot;), &quot;ICON2.ico&quot;
	SaveToFile .ReadIcon(&quot;3&quot;), &quot;ICON3.ico&quot;
	SaveToFile .ReadIcon(&quot;4&quot;), &quot;ICON4.ico&quot;
	SaveToFile .ReadIcon(&quot;5&quot;), &quot;ICON5.ico&quot;
	SaveToFile .ReadIcon(&quot;6&quot;), &quot;ICON6.ico&quot;
	SaveToFile .ReadIcon(&quot;7&quot;), &quot;ICON7.ico&quot;
	SaveToFile .ReadIcon(&quot;8&quot;), &quot;ICON8.ico&quot;
	SaveToFile .ReadIconGroup(&quot;62998&quot;), &quot;FULL_ICON.ico&quot;
End With

MsgBox &quot;DONE !&quot;,vbInformation

Sub SaveToFile(data, fileName)
	With CreateObject(&quot;ADODB.Stream&quot;)
		.Type = 1
		.Open
		.Write data
		.SaveToFile fileName, 2
	End With
End Sub

Class cResReader
	Dim FileName, Source
	Private Sub Class_Initialize()
		&#039;Saving class name for using as source with err.raise
		Source = TypeName(Me)
	End Sub
		
	&#039;Sub for selecting file for parsing
	Sub Open(Path)
		FileName = Path
	End Sub
	
	&#039;Function for loading single icon
	Function ReadIcon(Id)
		Dim Stream, Buffer, ColorCount, BitCount
		&#039;3 - RT_ICON
		Set Stream = ReadRes(3,Id)
		&#039;Reading 5 field of BITMAPINFOHEADER [DWORD biSize; LONG biWIdth; LONG  biHeight; WORD  biPlanes; WORD  biBitCount]
		Buffer = Stream.Read(16)
		&#039;Rewinding Stream for second use
		Stream.Position = 0
		&#039;Checking for PNG prefix
		If InStrB(1,Buffer,ChrB(&amp;H89) &amp; ChrB(&amp;H50) &amp; ChrB(&amp;H4E) &amp; ChrB(&amp;H47)) Then
			ReadIcon = Stream.Read
		Else
			&#039;Calculating color Count
			BitCount = ToNum(MidB(Buffer,15,2))
			ColorCount = 2 ^ BitCount: if ColorCount &gt; 32 Then ColorCount = 0
			&#039;Building icon data
			With CreateObject(&quot;SAPI.spMemoryStream&quot;)
				.Write CInt(0)								&#039;idReserved 	(must be 0)
				.Write CInt(1)								&#039;idType			(must be 1)
				.Write CInt(1)								&#039;idCount		(1 icon)
				.Write CByte(ToNum(MidB(Buffer,5,4)))		&#039;bWIdth			(biWIdth)
				.Write CByte(ToNum(MidB(Buffer,9,4)))		&#039;bHeight		(biHeight)
				.Write CByte(ColorCount)					&#039;bColorCount	(2 ^ biBitCount [8,16,32] if more than 0)
				.Write CByte(0)								&#039;bReserved		(always 0)
				.Write CInt(ToNum(MidB(Buffer,13,2)))		&#039;wPlanes		(biPlanes)
				.Write CInt(BitCount)						&#039;wBitCount		(biBitCount)
				.Write CLng(Stream.Size)					&#039;dwBytesInRes	(stream.Size)
				.Write Clng(22)								&#039;dwImageOffset
				.Write Stream.Read							
				ReadIcon = .GetData
			End With
		End if
	End Function
	
	&#039;Function for loading icon group
	Function ReadIconGroup(GroupId)
		Dim Buffer, Count, Id, Offset, Size, Stream, i
		&#039;Reading resource data (14 - RT_ICON_GROUP)
		Set Stream = ReadRes(14,GroupId)
		&#039;Reading GRPICONDIR struct
		Buffer = Stream.Read(6)
		&#039;Checking fields idReserved (must be 0) and IdType (1 for icons)
		If ToNum(MidB(Buffer,1,2)) &lt;&gt; 0 Then Err.Raise vbObjectError + 1, Source, &quot;Invalid value in reserved field&quot;
		If ToNum(MidB(Buffer,3,2)) &lt;&gt; 1 Then Err.Raise vbObjectError + 2, Source, &quot;Invalid resource type&quot;
		&#039;Reading icons count
		Count = ToNum(MidB(Buffer,5,2))
		&#039;Prepairing array for icon id-s (for future loading it&#039;s data)
		Redim Ids(Count-1)
		&#039;Creating stream for data
		With CreateObject(&quot;SAPI.spMemoryStream&quot;)
			&#039;Calculating first offset [GRPICONDIR size + GRPICONDIRENTRY size * icons Count]
			Offset = 6 + 16 * Count
			&#039;Writing header to stream
			.Write Buffer
			For i=0 to Count-1
				&#039;Reading Icon fields [bWidth, bHeight, bColors, bReserved, wPlanes, BitCount, dwBytesInRes] except [nId]
				Buffer = Stream.Read(12)
				&#039;Writing ICON header block to stream
				.Write Buffer
				&#039;Reading DWORD dwBytesInRes
				Size = Clng(ToNum(RightB(Buffer,4)))
				&#039;Reading Icon Id for future reading icon data
				Ids(i) = ToNum(Stream.Read(2))
				&#039;Writing DWORD dwImageOffset
				.Write CLng(Offset)
				&#039;Calculating next Offset
				Offset = Offset + Size
			Next
			&#039;Reading icon &quot;bodies&quot; from resource and writing to stream 
			For Each Id in Ids
				.Write ReadRes(3,Id).Read
			Next
			ReadIconGroup = .GetData
		End With
	End Function
	
	&#039;Function for loading data from url
	Private Function ReadRes(ResType,Id)
		Set ReadRes = CreateObject(&quot;CDO.Message&quot;) _
		.AddAttachment(&quot;res://&quot; &amp; FileName &amp; &quot;/&quot; &amp; ResType &amp; &quot;/&quot; &amp; Id) _
		.GetDecodedContentStream
		&#039;Enabling binary mode
		ReadRes.Type = 1
	End Function
	
	&#039;Function for converting bytes to number
	Private Function ToNum(b)
		Dim i: For i = 1 To LenB(b)
			ToNum = ToNum Or AscB(MidB(b, i, 1)) * &amp;H100 ^ (i - 1)
		Next
	End Function
End Class
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Wed, 01 Mar 2017 15:42:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=113493#p113493</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=113143#p113143</link>
			<description><![CDATA[<p>Интересно, почему при подстановке %COMMANDER_EXE% вместо g:\Total Commander\TOTALCMD.EXE иконка сохраняется, но возникает неопознаная ошибка на строке с .Open &quot;GET&quot;, &quot;res://&quot;? <img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" /><br /></p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>Пусто? Тогда меняем во всех примерах res://shell32.dll/3/1 на res://c:\Program Files (x86)\Skype\Phone\Skype.exe/3/5 - там точно png-шка имеется.</p></blockquote></div><p>А перед этим не забыть сменить систему на x64 и установить скайп. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 23 Feb 2017 19:00:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=113143#p113143</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=113126#p113126</link>
			<description><![CDATA[<p><strong>mozers</strong>, О ! Отлично ! ) А я пока что никак не успевал заняться. Как освобожусь от рабочих дел - изучу. Спасибо ! )</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 23 Feb 2017 17:52:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=113126#p113126</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=113066#p113066</link>
			<description><![CDATA[<div class="codebox"><pre><code>Option Explicit

SaveSingleIcon &quot;shell32.dll&quot;, &quot;162&quot;
SaveWholeIcon &quot;g:\Total Commander\TOTALCMD.EXE&quot;, &quot;MAINICON&quot;

Sub SaveSingleIcon(resFile, iconID)
	Dim iconData, iconSize, iconHeader
	iconData = GetIconData(resFile, &quot;3&quot;, iconID) &#039; Icon Entry
	If IsEmpty(iconData) Then
		WScript.Echo &quot;res://&quot; &amp; resFile &amp; &quot;/3/&quot; &amp; iconID &amp; &quot; not found!&quot; : Exit Sub
	End If
	With CreateObject(&quot;SAPI.spFileStream&quot;)
		If AscB(iconData) = &amp;H89 Then &#039; ----- Save as PNG
			.Open iconID &amp; &quot;.png&quot;, 2
			.Write iconData
		Else &#039; ---------- Save as ICO
			.Open iconID &amp; &quot;.ico&quot;, 2
			&#039; Общий заголовок (6 байт)
			.Write CInt(0) &#039;reserved
			.Write CInt(1) &#039;type
			.Write CInt(1) &#039;count

			&#039; Заголовок иконки (16 байт)
			iconSize = CLng(LenB(iconData))
			Select Case iconSize
				Case 67624 : iconHeader = Array(CByte(128), CByte(128), CInt(32))
				Case 38056 : iconHeader = Array(CByte(96), CByte(96), CInt(32))
				Case 16936 : iconHeader = Array(CByte(64), CByte(64), CInt(32))
				Case 9640  : iconHeader = Array(CByte(48), CByte(48), CInt(32))
				Case 6760  : iconHeader = Array(CByte(40), CByte(40), CInt(32))
				Case 4264  : iconHeader = Array(CByte(32), CByte(32), CInt(32))
				Case 2440  : iconHeader = Array(CByte(24), CByte(24), CInt(32))
				Case 1720  : iconHeader = Array(CByte(20), CByte(20), CInt(32))
				Case 1128  : iconHeader = Array(CByte(16), CByte(16), CInt(32))
				Case 2216  : iconHeader = Array(CByte(32), CByte(32), CInt(8))
				Case 1384  : iconHeader = Array(CByte(16), CByte(16), CInt(8))
				Case 1736  : iconHeader = Array(CByte(24), CByte(24), CInt(8))
				Case 296   : iconHeader = Array(CByte(16), CByte(16), CInt(4))
				Case 744   : iconHeader = Array(CByte(32), CByte(32), CInt(4))
				Case 488   : iconHeader = Array(CByte(24), CByte(24), CInt(4))
				Case Else  : iconHeader = Array(CByte(32), CByte(32), CInt(0))
			End Select
			.Write CByte(32) &#039;width
			.Write CByte(32) &#039;height
			.Write CByte(32) &#039;colors
			.Write CByte(0) &#039;reserved
			.Write CInt(0) &#039;planes
			.Write CInt(0) &#039;bpp
			.Write iconSize &#039;size
			.Write CLng(6 + 16) &#039; offset
			&#039; Содержимое иконки
			.Write iconData
		End If
		.Close
	End With
End Sub

Sub SaveWholeIcon(resFile, groupID)
	Dim groupData, imgCount, offset, pos, nImg, imgSize, arrResOffset

	groupData = GetIconData(resFile, &quot;14&quot;, groupID) &#039; Group Icon
	If IsEmpty(groupData) Then
		WScript.Echo &quot;res://&quot; &amp; resFile &amp; &quot;/14/&quot; &amp; groupID &amp; &quot; not found!&quot; : Exit Sub
	End If
	With CreateObject(&quot;SAPI.spFileStream&quot;)
		.Open groupID &amp; &quot;.ico&quot;, 2

		&#039; Общий заголовок группы иконок (6 байт)
		.Write CInt(GetValue(groupData, pos, 2)) &#039;reserved
		.Write CInt(GetValue(groupData, pos, 2)) &#039;type
		imgCount = GetValue(groupData, pos, 2)
		.Write CInt(imgCount) &#039;count

		&#039; Заголовки иконок (по 16 байт каждая)
		Set arrResOffset = CreateObject(&quot;Scripting.Dictionary&quot;)
		offset = 6 + 16 * imgCount
		For nImg = 1 To imgCount
			.Write CByte(GetValue(groupData, pos, 1)) &#039;width
			.Write CByte(GetValue(groupData, pos, 1)) &#039;height
			.Write CByte(GetValue(groupData, pos, 1)) &#039;colors
			.Write CByte(GetValue(groupData, pos, 1)) &#039;reserved
			.Write CInt(GetValue(groupData, pos, 2)) &#039;planes
			.Write CInt(GetValue(groupData, pos, 2)) &#039;bpp
			imgSize = CLng(GetValue(groupData, pos, 4))
			.Write imgSize &#039;size
			arrResOffset.Add arrResOffset.Count, GetValue(groupData, pos, 2) &#039; offset
			.Write CLng(offset) &#039; offset
			offset = offset + imgSize
		Next

		&#039; Содержимое иконок
		For nImg = 0 To arrResOffset.Count - 1
			.Write GetIconData(resFile, &quot;3&quot;, arrResOffset.Item(nImg)) &#039; Icon Entry
		Next
		.Close
	End With
End Sub

&#039; Возвращает 1/2/4 байтное число и новое смещение
Function GetValue(data, start, length)
	Dim val, s
	For s = 0 To length - 1
		val = val + AscB(MidB(data, start + s + 1, 1)) * 256 ^ s
	Next
	GetValue = val
	start = start + length
End Function

Function GetIconData(resFile, resType, resID)
	With CreateObject(&quot;MSXML2.XMLHTTP&quot;)
		.Open &quot;GET&quot;, &quot;res://&quot; &amp; resFile &amp; &quot;/&quot; &amp; resType &amp; &quot;/&quot; &amp; resID, False
		On Error Resume Next
		.Send
		GetIconData = .responseBody
	End With
End Function
</code></pre></div><p><strong>Xameleon</strong>, похоже это - финальный вариант (за неделю не изменил ни строчки - так и выложил). Если есть желание - можешь включить в свой <span style="color: blue">WSC:Script Component</span>.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Thu, 23 Feb 2017 09:01:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=113066#p113066</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112639#p112639</link>
			<description><![CDATA[<p><strong>mozers</strong><br /></p><div class="quotebox"><blockquote><p>Ну тогда осталась лишь одна реальная проблема - найти способ извлекать список имен ресурсов.</p></blockquote></div><p>Так в том то и дело, что и это Вы уже сделали, поделившись <a href="http://www.jsware.net/jsware/zips/iconex.zip">ссылкой</a>.<br />Там уже всё это реализовано. ) Если причесать код, то должно получиться вполне удачное решение.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 16 Feb 2017 10:53:00 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112639#p112639</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112638#p112638</link>
			<description><![CDATA[<p><strong>Xameleon</strong></p><div class="quotebox"><blockquote><p>Ни кто не запрещает именованные извлекать через res.</p></blockquote></div><p>Действительно так! А я, сделав лишь одну неудачную попытку, тут же поверил <a href="https://msdn.microsoft.com/ru-ru/library/aa767740(v=vs.85).aspx">документации</a></p><div class="quotebox"><blockquote><p>// This is not correct.<br />&quot;res://mydll.dll/#2/MYBITMAP&quot;</p></blockquote></div><p>Ну тогда осталась лишь одна реальная проблема - найти способ извлекать список имен ресурсов.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Thu, 16 Feb 2017 10:18:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112638#p112638</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112636#p112636</link>
			<description><![CDATA[<p><strong>mozers</strong>, <br /></p><div class="quotebox"><blockquote><p>неспособностью извлекать ресурсы из неномерных секций;</p></blockquote></div><p>Почему ? Ни кто не запрещает именованные извлекать через res.</p><p>Не уверен, что на семёрке есть эта иконка, взял первую попавшуюся из ieframe.dll на 10-ке.<br /></p><div class="codebox"><pre><code>
&lt;img src=&quot;res://ieframe.dll/2/CONTROL_HOT_120.BMP&quot;&gt;
</code></pre></div><div class="quotebox"><blockquote><p>Вариант побитового парсинга уже реализован</p></blockquote></div><p>Изучаю ! ) КРАЙНЕ ПОЛЕЗНЫЙ материал. ) Взял на заметку. Благодарю !</p><p><strong>UPD</strong></p><p>Поизучал код. ) Автор, как и я, подумал, что заголовок можно цеплять к иконке на основании размера её содержимого в байтах. Но я откинул эту идею, как кривое решение, а автор всё-таки реализовал.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Thu, 16 Feb 2017 07:56:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112636#p112636</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112634#p112634</link>
			<description><![CDATA[<p><strong>Xameleon</strong>, интересный метод. Надо его поизучать на досуге как альтернативу ADODB.Stream / SAPI.spFileStream.<br />О наших баранах:<br />Вариант побитового парсинга уже <a href="http://www.jsware.net/jsware/zips/iconex.zip">реализован</a>. Недостатки - налицо: чрезвычайно замудрено и медленно. Поскольку все параметры заданы жестко, а правила достаточно гибки - много иконок тупо не находит.<br />Вся прелесть предложенного тобой метода - в протоколе <span style="color: blue">res://</span> , позволяющем запросто извлекать любые заданные ресурсы. Увы, видимо, придется смирится с его ограничениями:<br />- неспособностью извлекать ресурсы из неномерных секций;<br />- отсутствием возможности получить список доступных номеров.<br />Хотя, может быть, найдется новый гений и предложит решение хотя бы одной из этих проблем.</p><p><strong>Flasher</strong>, как уже сказал <strong>Xameleon</strong> в <span style="color: blue">res://shell32.dll/3/1</span> (Win7) никакой png-шки просто нет (там - обычная иконка без заголовка). Проще всего проверять на hta-шке </p><div class="codebox"><pre><code>&lt;HTML&gt;&lt;BODY&gt;&lt;IMG src=&quot;res://shell32.dll/3/1&quot;&gt;&lt;/BODY&gt;&lt;/HTML&gt;</code></pre></div><p>Пусто? Тогда меняем во всех примерах <span style="color: blue">res://shell32.dll/3/1</span> на <span style="color: blue">res://c:\Program Files (x86)\Skype\Phone\Skype.exe/3/5</span> - там точно png-шка имеется.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Thu, 16 Feb 2017 07:29:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112634#p112634</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112558#p112558</link>
			<description><![CDATA[<p><strong>Flasher</strong>, видимо на Win 7 эта картинка в ресурсах не существует. У меня на Win 10 выдаёт:</p><div class="quotebox"><blockquote><p>image/x-png</p></blockquote></div><p>и сохраняет картинку успешно.</p><p><strong>UPD</strong></p><p>Выяснил. Взял Вашу <strong>shell32.dll</strong>, натравил на неё скрипт и получил такой же (неудачный) результат. Оказалось внутри ICON 1 лежит тело иконки без заголовка 32x32, а не PNG, как на Win 10. Файл создаётся, в него пишется тело этой ущербной иконки. Поэтому он и не открывается.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Wed, 15 Feb 2017 11:22:43 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112558#p112558</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112552#p112552</link>
			<description><![CDATA[<p><strong>Xameleon</strong><br />Выдаёт <em>text/html</em> и сохраняет пустой png.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Wed, 15 Feb 2017 10:18:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112552#p112552</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112547#p112547</link>
			<description><![CDATA[<p>Ещё одна интересная альтернативка.<br /></p><div class="codebox"><pre><code>
Const adSaveCreateOverWrite = 2
With CreateObject(&quot;CDO.Message&quot;).AddAttachment(&quot;res://shell32.dll/3/1&quot;)
	MsgBox .ContentMediaType
	.GetDecodedContentStream.SaveToFile &quot;1.png&quot;, adSaveCreateOverWrite
End With
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Wed, 15 Feb 2017 09:44:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112547#p112547</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112422#p112422</link>
			<description><![CDATA[<p><strong>mozers</strong>, ага. ) Именно так. Более того, идентификаторы иконок и групп могут быть строковыми. Например в файле explorer.exe есть группа &quot;ICO_MYCOMPUTER&quot;. Видимо есть 2 пути:<br />1) Разбирать весь PE заголовок через ADODB.Stream / SAPI.spFileStream и находить все эти данные внутри и тогда вообще можно отказаться от res протокола. )))</p><p>2) Забить на поиск и реализовать по принципу, как я описывал <a href="http://forum.script-coding.com/viewtopic.php?pid=112307#p112307">тут</a>.</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Tue, 14 Feb 2017 07:50:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112422#p112422</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112421#p112421</link>
			<description><![CDATA[<p>Главная неприятность - то что номера иконок идут не подряд. В случае с shell32.dll скрипт обрывается на 64, поскольку следующий номер - 70. Вот как бы узнать все эти номера... Или придумать функцию, получающую следующий доступный номер...<br />Можно узнать номера иконок входящих в одну группу (из RT_GROUP_ICON), но с остальными - тоже самое, т.к. номера групп тоже не подряд идут.</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Tue, 14 Feb 2017 06:30:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112421#p112421</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112395#p112395</link>
			<description><![CDATA[<p><strong>mozers</strong>, запустил, получил несколько дёрганий курсора, но иконки выгрузились успешно ! ) Клёво ! Завтра изучу подробнее код. ) Сэр, крайне благодарен вам за активное участие ! Начинаю чувствовать, что не одинок в своих экспериментах.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p><span class="postimg"><img src="https://68.media.tumblr.com/dc2acffbea837dc5277bb1b469aafbb7/tumblr_n7u8czdwFI1qzs5cqo1_500.gif" alt="https://68.media.tumblr.com/dc2acffbea837dc5277bb1b469aafbb7/tumblr_n7u8czdwFI1qzs5cqo1_500.gif" /></span></p></div></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 13 Feb 2017 20:59:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112395#p112395</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSC: Script Component для чтения ресурсов из файлов через res протокол]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=112340#p112340</link>
			<description><![CDATA[<p><strong>Xameleon</strong><br />Ну, например, PE Explorer при сохранении из ресурсов одинарных ico-нок поступает именно так &quot;некорректно&quot;.<br />В первом грубом приближении получается как то так - <span style="color: blue">IconExtractor.vbs</span>:</p><div class="codebox"><pre><code>On Error Resume Next

file = &quot;c:\Windows\SYSTEM32\shell32.dll&quot;
&#039; file = &quot;c:\Program Files (x86)\Skype\Phone\Skype.exe&quot;

inum = 0
Do
	inum = inum + 1
	With CreateObject(&quot;MSXML2.XMLHTTP&quot;)
		.Open &quot;GET&quot;, &quot;res://&quot; &amp; file &amp; &quot;/#3/#&quot; &amp; inum, False
		.Send
		idata = .responseBody
	End With
	ilen = LenB(idata)
	If ilen = 0 Then WScript.Quit

	With CreateObject(&quot;SAPI.spFileStream&quot;)
		If AscB(idata) = &amp;H89 Then &#039; ----- Save as PNG
			.Open inum &amp; &quot;.png&quot;, 2
			.Write idata
			.Close
		Else &#039; ---------- Save as ICO
			.Open inum &amp; &quot;.ico&quot;, 2
			.Write CInt(0) &#039;reserved
			.Write CInt(1) &#039;type
			.Write CInt(1) &#039;count

			.Write CByte(32) &#039;width
			.Write CByte(32) &#039;height
			.Write CByte(32) &#039;colors
			.Write CByte(0) &#039;reserved
			.Write CInt(0) &#039;planes
			.Write CInt(0) &#039;bpp
			.Write CLng(ilen) &#039;size
			.Write CLng(22) &#039; offset
			.Write idata
			.Close
		End If
	End With
Loop
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Mon, 13 Feb 2017 17:28:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=112340#p112340</guid>
		</item>
	</channel>
</rss>
