1 (изменено: Alexey, 2011-05-25 18:07:53)

Тема: HTA: Хранение ресурсов в HTA

Возникла необходимость хранить картинки в теле HTA документа. Проблем для систем с Internet Explorer >=8 вообще не возникает:

.mystyle{
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAwklEQVRYhe3XXQqDMBhE0dtsIKvNwrOC+mIhTfNrlAzlm0eR4ShomFcI4U2WGGN+6Sfe++49d/S5O8tKWe37AqrhIAEq4uAEquIAnDIOCh/JStkTD9sE7sZB4w0q4KACVMFBAaiEgwyohoMEqIiDE6iKA3DKOBj4Uc+UPfGwQ8Cdx2EXuPusbgJ346ABVMBBBaiCA9sktknmyj6xTXK1zDbJalkrtklGykqxTTJTlsY2yZUysE2yVjYa2yS1sl7+cpMcegPyrqBRcaoAAAAASUVORK5CYIL=);
}

В системах с Internet Explorer 6 и 7 тоже можно с помощью mhtml css hack.

Но хранить одни и те же ресурсы для разных IE как то не комильфо.
Для решения этой задачи я сделал следующее:
1) завернул ресурсы в тег <!-- '--> в начале HTA файла.

<!--
/*
Content-Type: multipart/related; boundary="_ANY_STRING_WILL_DO_AS_A_SEPARATOR"

--_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--
*/
'-->
<html>...

2)Прописал в стиле HTA файла мою будущую картинку такого вот вида идентификатором

<style type="text/css">
.hiddenlayer{
    background:#666666 50% 50% repeat url(!BASE64-background!);
}

3)При загрузке HTA файла вызываю функцию, модифицирующую cssText для разных версий Internet Explorer

Function ShowBASE64Images
    Set fso = CreateObject("Scripting.Filesystemobject")                
    file_text=fso.OpenTextFile(Replace(document.url,"file://",""),1).readall 'it's my own contents
    Set fso = Nothing
    Set RExp = CreateObject("VBScript.RegExp")
    RExp.Global=True
    RExp.Pattern="!BASE64-.*!"
    For i=0 To document.styleSheets.length-1        
        For Each base64record In RExp.Execute(document.styleSheets(i).cssText) 'iterate each !BASE64-.*! pattern
            base64id=Replace(Replace(base64record,"!",""),"BASE64-","")
            If GetIEVersion<8 Then 
                document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,"mhtml:"&document.URLUnencoded&"!"&base64id)'for ie=6=7 set pattern to mhtml:file...!id
            Else                
                RExp.Pattern="Content\-Location\:"&base64id&"(.*\n)+?\-" 'get only this id section
                For Each base64my_record In RExp.Execute(file_text)
                    RExp.Pattern="Content\-Location\:"&base64id&"(.*\n)+?\s" 'will replace this data
                    result=RExp.Replace(base64my_record,"") 'replace this data
                    result=Left(result,Len(result)-1) 'cut last symbols
                    RExp.Pattern="\n"
                    result=RExp.Replace(result,"")'clear \r\n
                    result="data:image/png;base64,"&Trim(result)&");" 'trim all data
                Next                
                document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,result)'set new cssText
            End If
        Next    
    Next
    Set RExp = Nothing
End function

function GetIEVersion
    Set WshShell = CreateObject("Wscript.Shell")
    GetIEVersion=Left(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version"),1)
End Function

В результате чего ресурсы хранятся в файле один раз и отображаются во всех версиях IE.

2

Re: HTA: Хранение ресурсов в HTA

Вот полностью рабочий пример

3 (изменено: BeS Yara, 2011-05-26 09:02:24)

Re: HTA: Хранение ресурсов в HTA

Интересный вариант
Я решал проблему примитивнее - при запуске проверял есть ли нужный файл в папке с HTA-шкой. Если файла нет, то сохранял его(из переменной где он был в Base64) туда и обновлял страницу.

4

Re: HTA: Хранение ресурсов в HTA

В общем, как я понял, если версия IE до 8, то отобрать картинки через протокол mhtml. Если от 8 и выше, то через base64. Верно?

5

Re: HTA: Хранение ресурсов в HTA

JSman пишет:

В общем, как я понял, если версия IE до 8, то отобрать картинки через протокол mhtml. Если от 8 и выше, то через base64. Верно?

Да.Подменяем CSS стили. Если IE<8 интерпретируем HTAфайл как mhtml файл и берем ресурсы из него(mhtml), если IE >=8 то берем ресурсы в BASE64 и подкладываем их в модифицируемый стиль.(DATA Uri).

6

Re: HTA: Хранение ресурсов в HTA

Alexey, пример ещё не в Коллекции? Если нет — поместите его туда, пожалуйста.

7 (изменено: Alexey, 2011-06-06 13:36:12)

Re: HTA: Хранение ресурсов в HTA

alexii пишет:

Alexey, пример ещё не в Коллекции? Если нет — поместите его туда, пожалуйста.

Перенес.

8

Re: HTA: Хранение ресурсов в HTA

Alexey, спасибо. Открепляю.

А что рабочий пример недоступен? Может, проще его в zip и прямо к посту прикрепить, а?

9 (изменено: Alexey, 2011-06-06 13:55:22)

Re: HTA: Хранение ресурсов в HTA

alexii пишет:

Alexey, спасибо. Открепляю.

А что рабочий пример недоступен? Может, проще его в zip и прямо к посту прикрепить, а?

Сейчас из-за ограничивающего корпоративного прокси прикрепить пример к посту не могу. Вечером прикреплю к посту. Пример уже скачивается.

10

Re: HTA: Хранение ресурсов в HTA

Alexey, а от 8 IE и выше разве указанный хак утратил свою функциональность?:) У меня в 8 все нормально отображается.

11 (изменено: Alexey, 2011-06-07 23:25:20)

Re: HTA: Хранение ресурсов в HTA

Alexey пишет:
alexii пишет:

Alexey, спасибо. Открепляю.

А что рабочий пример недоступен? Может, проще его в zip и прямо к посту прикрепить, а?

Сейчас из-за ограничивающего корпоративного прокси прикрепить пример к посту не могу. Вечером прикреплю к посту. Пример уже скачивается.

Пример прикрепил.

JSman пишет:

Alexey, а от 8 IE и выше разве указанный хак утратил свою функциональность?:) У меня в 8 все нормально отображается.

У меня нет IE 8. Я тестил на IE9 и IE6. В IE9 хак не работает.

12

Re: HTA: Хранение ресурсов в HTA

Alexey пишет:

Пример прикрепил.

Спасибо.