<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; HTA: Хранение ресурсов в HTA]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5880</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5880&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «HTA: Хранение ресурсов в HTA».]]></description>
		<lastBuildDate>Mon, 06 Jun 2011 09:30:54 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[HTA: Хранение ресурсов в HTA]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=48981#p48981</link>
			<description><![CDATA[<p>Возникла необходимость хранить картинки в теле HTA документа. Проблем для систем с Internet Explorer &gt;=8 вообще не возникает, используя DATA Uri можно хранить рисунок в BASE64 прямо в стиле документа:</p><div class="codebox"><pre><code>
.mystyle{
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAwklEQVRYhe3XXQqDMBhE0dtsIKvNwrOC+mIhTfNrlAzlm0eR4ShomFcI4U2WGGN+6Sfe++49d/S5O8tKWe37AqrhIAEq4uAEquIAnDIOCh/JStkTD9sE7sZB4w0q4KACVMFBAaiEgwyohoMEqIiDE6iKA3DKOBj4Uc+UPfGwQ8Cdx2EXuPusbgJ346ABVMBBBaiCA9sktknmyj6xTXK1zDbJalkrtklGykqxTTJTlsY2yZUysE2yVjYa2yS1sl7+cpMcegPyrqBRcaoAAAAASUVORK5CYIL=);
}</code></pre></div><p>К сожалению, такой вариант не подходит для IE&lt;8.<br />В системах с Internet Explorer 6 и 7 можно использовать <a href="http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/">mhtml css hack</a>.</p><p>Но хранить одни и те же ресурсы для разных IE как то не комильфо.<br />Было решено хранить ресурсы в mhtml-блоке (BASE64 enocded)&nbsp; в теге &lt;!-- &#039;--&gt; в начале HTA файла.</p><div class="codebox"><pre><code>&lt;!--
/*
Content-Type: multipart/related; boundary=&quot;_ANY_STRING_WILL_DO_AS_A_SEPARATOR&quot;

--_ANY_STRING_WILL_DO_AS_A_SEPARATOR
Content-Location:background
Content-Transfer-Encoding:base64

iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAwklEQVRYhe3XXQqDMBhE0dtsIKvNwrOC+mIhTfNrlAzlm0eR4ShomFcI4U2WGGN+6Sfe++49d/S5O8tKWe37AqrhIAEq4uAEquIAnDIOCh/JStkTD9sE7sZB4w0q4KACVMFBAaiEgwyohoMEqIiDE6iKA3DKOBj4Uc+UPfGwQ8Cdx2EXuPusbgJ346ABVMBBBaiCA9sktknmyj6xTXK1zDbJalkrtklGykqxTTJTlsY2yZUysE2yVjYa2yS1sl7+cpMcegPyrqBRcaoAAAAASUVORK5CYIL=

--_ANY_STRING_WILL_DO_AS_A_SEPARATOR
Content-Location:loading_bar
Content-Transfer-Encoding:base64

R0lGODlh3AATAPQAAP///wAAA.....

--_ANY_STRING_WILL_DO_AS_A_SEPARATOR--
*/
&#039;--&gt;
&lt;html&gt;...</code></pre></div><p>Таким образом эта часть HTA-документа считается комментарием и не отображается, зато ее можно использовать как mhtml-источник для отображения графики в IE&lt;8. </p><div class="codebox"><pre><code>
background-image: url(mhtml:http://phpied.com/mhtml.css!somestring);</code></pre></div><p>Для отображения в IE&gt;=8 будем использовать DATA Uri. <br />С помощью специальной процедуры необходимо подготовить соответствующий стиль HTA-приложения, но сначала<br />в css блоке опишем картинку специальный идентификатором !BASE64-background!, где background - mhtml идентификатор необходимого нам ресурса.<br /></p><div class="codebox"><pre><code>&lt;style type=&quot;text/css&quot;&gt;
.hiddenlayer{
	background:#666666 50% 50% repeat url(!BASE64-background!);
}</code></pre></div><p>и теперь модифицируем стили<br /></p><div class="codebox"><pre><code>Function ShowBASE64Images
	Set fso = CreateObject(&quot;Scripting.Filesystemobject&quot;)				
	file_text=fso.OpenTextFile(Replace(document.url,&quot;file://&quot;,&quot;&quot;),1).readall &#039;it&#039;s my own contents
	Set fso = Nothing
	Set RExp = CreateObject(&quot;VBScript.RegExp&quot;)
	RExp.Global=True
	RExp.Pattern=&quot;!BASE64-.*!&quot;
	For i=0 To document.styleSheets.length-1		
		For Each base64record In RExp.Execute(document.styleSheets(i).cssText) &#039;iterate each !BASE64-.*! pattern
			base64id=Replace(Replace(base64record,&quot;!&quot;,&quot;&quot;),&quot;BASE64-&quot;,&quot;&quot;)
			If GetIEVersion&lt;8 Then 
				document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,&quot;mhtml:&quot;&amp;document.URLUnencoded&amp;&quot;!&quot;&amp;base64id)&#039;for ie=6=7 set pattern to mhtml:file...!id
			Else				
				RExp.Pattern=&quot;Content\-Location\:&quot;&amp;base64id&amp;&quot;(.*\n)+?\-&quot; &#039;get only this id section
				For Each base64my_record In RExp.Execute(file_text)
					RExp.Pattern=&quot;Content\-Location\:&quot;&amp;base64id&amp;&quot;(.*\n)+?\s&quot; &#039;will replace this data
					result=RExp.Replace(base64my_record,&quot;&quot;) &#039;replace this data
					result=Left(result,Len(result)-1) &#039;cut last symbols
					RExp.Pattern=&quot;\n&quot;
					result=RExp.Replace(result,&quot;&quot;)&#039;clear \r\n
					result=&quot;data:image/png;base64,&quot;&amp;Trim(result)&amp;&quot;);&quot; &#039;trim all data
				Next				
				document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,result)&#039;set new cssText
			End If
		Next	
	Next
	Set RExp = Nothing
End function

function GetIEVersion
	Set WshShell = CreateObject(&quot;Wscript.Shell&quot;)
	GetIEVersion=Left(WshShell.RegRead(&quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version&quot;),1)
End Function</code></pre></div><p>В результате таких нехитрых манипуляций ресурсы хранятся в файле один раз и отображаются во всех версиях IE.</p>]]></description>
			<author><![CDATA[null@example.com (Alexey)]]></author>
			<pubDate>Mon, 06 Jun 2011 09:30:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=48981#p48981</guid>
		</item>
	</channel>
</rss>
