Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Автоматическое создание из папки с иконками библиотеки DLL
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Fri Jan 22, 2010 03:20    Post subject: Автоматическое создание из папки с иконками библиотеки DLL Reply with quote

Есть папка с иконками, которая переодически меняется, добавляется
Как автоматически создавать из этой папки (этих иконок) библиотеку dll?
1. Можно с помощью стороннего софта, но надо открыть прогу, и...
2. Использовать плагин ICLRead.wcx, но надо открыть исходную папку, и куда создавать, и ещё дополнительные нажимания
(переименование из icl в dll...)
Есть ли возможность одним нажатием
либо используя возможность командной строки какой-либо утилиты, либо плагин как-то использовать... Подскажите?

 !  Avada:
Три ошибки в одном заголовке — это многовато. Поправил. Поаккуратнее, пожалуйста.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Fri Jan 22, 2010 16:08    Post subject: Reply with quote

Code:
'  File:         Ico2DLL.vbs
'  Description:  Упаковывает все *.icо из указанной папки в одну библиотеку
'  Parameters:   "%P" "D:\Папка с иконками" "C:\Крутая библиотека.dll"
'  Installation: Создайте для скрипта, например, кнопку на панели TC
'  Requirements: WSH Helper for TC by Volniy + ICLRead by Progman13
'  Autor:        Tol!k

Option Explicit
Dim TCS, HomeSweetHome, IcoFolder, OutDLL

If WScript.Arguments.Count < 3 Then
  MsgBox "Маловато аргументов...", vbExclamation, "Ошибка"
  WScript.Quit()
End If
HomeSweetHome = WScript.Arguments(0)
IcoFolder = WScript.Arguments(1)
OutDLL = WScript.Arguments(2)

Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendKeystroke "+{RIGHT}"
TCS.SendKeystroke "cd " & IcoFolder & "{ENTER}"
TCS.SendCommand "cm_SpreadSelection", False
TCS.SendKeystroke "*.ico{ENTER}"
TCS.SendCommand "cm_PackFiles", False
TCS.SendKeystroke "icl:" & OutDLL & "{ENTER}"
TCS.Pause=2000

TCS.SendKeystroke "+{RIGHT}"
TCS.Pause=100
TCS.SendKeystroke "cd " & HomeSweetHome & "{ENTER}"
Set TCS = Nothing
WScript.Quit
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Fri Jan 22, 2010 22:02    Post subject: Reply with quote

Еще вариант, на Autoit+WinAPI. Делал для других целей, но с небольшой модификацией сгодилось и тут.

Code:

; Параметры: %P <имя dll>
; Требования: Autoit 3.3.4.0 (от 15.01.2010) или выше!

If $CmdLine[0] < 2 Then
    MsgBox (64, "", "Необходимо 2 параметра.")
    Exit
EndIf

Global Const $RT_ICON = 3
Global Const $RT_GROUP_ICON = 14
Global Const $FILE_BEGIN = 0
Global $nGroup_ID = 1
Global $nIcon_ID = 1
Global $sErrFiles = ""
Global $sSrcDir = $CmdLine[1]
Global $sNewLib = $CmdLine[2]

Dim $bStub = "0x" & _
"4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000" & _
"000000000000000000000000B00000000E1FBA0E00B409CD21B8014CCD21546869732069732033322D62697420726573" & _
"6F7572636520646C6C2E0D0D0A0000000000000000000000240000000000000029E701DB6D866F886D866F886D866F88" & _
"AA8069886C866F8832A465886C866F88526963686D866F880000000000000000504500004C0101000CA3E83A00000000" & _
"00000000E0000F010B010600000000001000000000000000000000000002000000020000000040001000000010000000" & _
"040000000000000004000000000000001002000000020000000000000200000000001000001000000000100000100000" & _
"000000001000000000000000000000000000000000000000000200001000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000002E72737263000000" & _
"100000000002000010000000000200000000000000000000000000004000004000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000"

$hLibFile = FileOpen($sNewLib, 2 + 16)
    FileWrite($hLibFile, $bStub)
FileClose($hLibFile)

$aRet = DllCall("kernel32.dll", "int", "BeginUpdateResource", "str", $sNewLib, "int", 1)
If @error Then
    MsgBox (0, "", "Не могу открыть библиотеку.")
    Exit
EndIf

$hUpdate = $aRet[0]

$hSearch = FileFindFirstFile($sSrcDir & "\*.ico")

While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop

    $hFile= FileOpen($sSrcDir & "\" & $sFile, 16)

    $nReserved = Int(FileRead($hFile, 2))
    $nType     = Int(FileRead($hFile, 2))
    $nSubIcons = Int(FileRead($hFile, 2))

    If Not (($nReserved = 0) And ($nType = 1)) Then
        $sErrFiles &= $sFile & @CRLF
        ContinueLoop
    EndIf

    $pGroupBuffer = DllStructCreate("byte[" & 6 + $nSubIcons*14 & "]")
    $pGroupHeader = DllStructCreate("word;word;word", DllStructGetPtr($pGroupBuffer))
    DllStructSetData($pGroupHeader, 1, 0)
    DllStructSetData($pGroupHeader, 2, 1)
    DllStructSetData($pGroupHeader, 3, $nSubIcons)
   
    For $j = 0 to $nSubIcons - 1
        $pBuffer = DllStructCreate("byte[16]")
        DllStructSetData($pBuffer, 1, FileRead($hFile, 16))
        $pFileIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;dword", DllStructGetPtr($pBuffer))
        $nDataSize = DllStructGetData($pFileIconResInfo, 7)
        $nOffset   = DllStructGetData($pFileIconResInfo, 8)
        $pResourceIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;word", DllStructGetPtr($pGroupBuffer)+6+14*$j)
        For $k = 1 To 7
            DllStructSetData($pResourceIconResInfo, $k, DllStructGetData($pFileIconResInfo, $k))
        Next
        DllStructSetData($pResourceIconResInfo, 8, $nIcon_ID)
        $nOldPos = FileGetPos($hFile)
        FileSetPos($hFile, $nOffset, $FILE_BEGIN)
        $pNewIcon = DllStructCreate("byte[" & $nDataSize & "]")
        DllStructSetData($pNewIcon, 1, FileRead($hFile, $nDataSize))
        FileSetPos($hFile, $nOldPos, $FILE_BEGIN)       
        DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_ICON, "int", $nIcon_ID, _
                                "word", 0, "ptr", DllStructGetPtr($pNewIcon), "int", $nDataSize)
        $nIcon_ID += 1
    Next
    DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_GROUP_ICON, "int", $nGroup_ID, _
                            "word", 0, "ptr", DllStructGetPtr($pGroupBuffer), "int", DllStructGetSize($pGroupBuffer))
    $nGroup_ID += 1
    FileClose($hFile)
WEnd

DllCall("kernel32.dll", "int", "EndUpdateResource", "int", $hUpdate, "int", 0)

If $sErrFiles <> "" Then MsgBox(48, "Внимание!", "Следующие иконки не добавлены (неверный формат?):" & @CRLF & @CRLF & $sErrFiles)
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Sun Jan 24, 2010 01:13    Post subject: Reply with quote

Loopback можно ли поподробнее спараметрами и подскажи что такое WinAPI. Я пытался вставить параметры, но что-то не выходит
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Sun Jan 24, 2010 22:16    Post subject: Reply with quote

Вызываешь скомпилированный экзешник из тотала с двумя параметрами командной строки:
первый параметр - %P (тут тотал подставит нужное значение)
второй параметр - <имя dll> (пишешь имя создаваемой длл, лучше с полным путём)
Всё это можно прописать в кнопке.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Sun Jan 24, 2010 22:57    Post subject: Reply with quote

Samwatas
Немного опередил Smile

Andrey_A
Все что написал Samwatas верно, только компилировать необязательно - можно задать путь в виде:

Code:

Команда: <путь к Autoit>\autoit3.exe  <путь к скрипту>\<имя скрипта>.au3
Параметры: %P <имя dll>


У меня, например, в каталоге тотала создан каталог Scripts, там лежит экзешник Autoit и скрипты - компактно (скрипты маленькие) и полностью портабельно, удобно в кнопках использовать с %COMMANDER_PATH%.

По поводу WinAPI. Это инструментарий разработчика в Windows, в данном случае имелся в виду вызов функций добавления ресурсов. Autoit - скриптовый язык, с весьма большим, но конечным количеством встроенных функций. Когда их не хватает, можно прибегнуть к вызову функций ОС.
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Mon Jan 25, 2010 02:23    Post subject: Reply with quote

Вставил параметры, но выдало dll очень маленького размера, без библиотеки
может у меня не та версия AutoIt3, у меня 3.3.0.0. , если нужна новее, дайте пожалуйста ссылку
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Mon Jan 25, 2010 12:23    Post subject: Reply with quote

Да, я же писал требования - версия только 3.3.4.0 и выше (в ней добавлено позиционирование в файле, что очень упростило код).
Скачать можно тут:
http://www.autoitscript.com/autoit3/downloads.shtml
Первая ссылка в таблице - инсталлятор, третья - самораспаковывающийся архив. Кому что удобнее.
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Mon Jan 25, 2010 21:05    Post subject: Reply with quote

Loopback wrote:
только компилировать необязательно

Мне кажется екзешник будет удобнее (нет привязки к установке АвтоИта - можно положить в папку с портативным Тоталом).
Ну тут, как говорится, о вкусах не спорят.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Mon Jan 25, 2010 22:00    Post subject: Reply with quote

Samwatas wrote:
Мне кажется екзешник будет удобнее (нет привязки к установке АвтоИта - можно положить в папку с портативным Тоталом).

Так привязки и не нужно - Autoit это единственный экзешник, который как раз и можно положить в каталог с тоталом, никакой инсталляции, записей в реестре и т.д - портативнее не придумаешь Smile Всё остальное, что идет с ним в дистрибутиве - вспомогательные библиотеки на все случаи жизни, справка, инструменты и т.д. - совершенно необязательно для работы.

В принципе, если скрипт один - можно скомпилировать и забыть. Если же их планируется несколько - имхо разумнее оставить экзешник отдельно, и место экономится, и подправить скрипт, если что, просто.
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Tue Jan 26, 2010 03:58    Post subject: Reply with quote

Скачал нужную версию, как я не пытался..., но всё же получилось создать библиотеку, но только тогда когда я в папке выделил все иконки и нажал кнопку скрипта с параметрами "%P" 1.dll.
Можно ли сделать библиотеку не входя в папку и не выделяя иконки, прописав просто путь к папке %COMMANDER_PATH%\Files\Icons\Wcmicons\
и ещё не срабатывает второй параметр, если вписываешь переменную "%%COMMANDER_PATH%%\Wcmicons.dll"
можно ли удалять библиотеку, если она есть из пути 2-го параметра
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Tue Jan 26, 2010 11:35    Post subject: Reply with quote

Andrey_A wrote:
Можно ли сделать библиотеку не входя в папку и не выделяя иконки, прописав просто путь к папке %COMMANDER_PATH%\Files\Icons\Wcmicons\

Можно, конечно. Первый параметр - в любом случае путь к иконкам. А как его задать - переменной %P или жестко заданный - не имеет значения.
В общем, кнопка примерно в таком виде должна работать:
Code:

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Scripts\AutoIt3.exe %COMMANDER_PATH%\Scripts\create_lib.au3
%%COMMANDER_PATH%%\Files\Icons\Wcmicons\ %%COMMANDER_PATH%%\wcmicons.dll

Создать библиотеку значков


-1


Разумеется, пути к экзешнику/скрипту надо поменять на свои.
Andrey_A wrote:

и ещё не срабатывает второй параметр, если вписываешь переменную "%%COMMANDER_PATH%%\Wcmicons.dll"

Так это и не было предусмотрено. Добавил функцию для разворачивания переменных окружения.

Code:

; 1 параметр - путь к каталогу с иконками
; 2 параметр - путь библиотеки
; Требования: Autoit 3.3.4.0 (от 15.01.2010) или выше!

If $CmdLine[0] < 2 Then
    MsgBox (64, "", "Необходимо 2 параметра.")
    Exit
EndIf

Global Const $RT_ICON = 3
Global Const $RT_GROUP_ICON = 14
Global Const $FILE_BEGIN = 0
Global $nGroup_ID = 1
Global $nIcon_ID = 1
Global $sErrFiles = ""
Global $sSrcDir = _TCHExpandEnv($CmdLine[1])
Global $sNewLib = _TCHExpandEnv($CmdLine[2])

Dim $bStub = "0x" & _
"4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000" & _
"000000000000000000000000B00000000E1FBA0E00B409CD21B8014CCD21546869732069732033322D62697420726573" & _
"6F7572636520646C6C2E0D0D0A0000000000000000000000240000000000000029E701DB6D866F886D866F886D866F88" & _
"AA8069886C866F8832A465886C866F88526963686D866F880000000000000000504500004C0101000CA3E83A00000000" & _
"00000000E0000F010B010600000000001000000000000000000000000002000000020000000040001000000010000000" & _
"040000000000000004000000000000001002000000020000000000000200000000001000001000000000100000100000" & _
"000000001000000000000000000000000000000000000000000200001000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000002E72737263000000" & _
"100000000002000010000000000200000000000000000000000000004000004000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000"

$hLibFile = FileOpen($sNewLib, 2 + 16)
    FileWrite($hLibFile, $bStub)
FileClose($hLibFile)

$aRet = DllCall("kernel32.dll", "int", "BeginUpdateResource", "str", $sNewLib, "int", 1)
If @error Then
    MsgBox (0, "", "Не могу открыть библиотеку.")
    Exit
EndIf

$hUpdate = $aRet[0]

$hSearch = FileFindFirstFile($sSrcDir & "\*.ico")

While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop

    $hFile= FileOpen($sSrcDir & "\" & $sFile, 16)

    $nReserved = Int(FileRead($hFile, 2))
    $nType     = Int(FileRead($hFile, 2))
    $nSubIcons = Int(FileRead($hFile, 2))

    If Not (($nReserved = 0) And ($nType = 1)) Then
        $sErrFiles &= $sFile & @CRLF
        ContinueLoop
    EndIf

    $pGroupBuffer = DllStructCreate("byte[" & 6 + $nSubIcons*14 & "]")
    $pGroupHeader = DllStructCreate("word;word;word", DllStructGetPtr($pGroupBuffer))
    DllStructSetData($pGroupHeader, 1, 0)
    DllStructSetData($pGroupHeader, 2, 1)
    DllStructSetData($pGroupHeader, 3, $nSubIcons)
   
    For $j = 0 to $nSubIcons - 1
        $pBuffer = DllStructCreate("byte[16]")
        DllStructSetData($pBuffer, 1, FileRead($hFile, 16))
        $pFileIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;dword", DllStructGetPtr($pBuffer))
        $nDataSize = DllStructGetData($pFileIconResInfo, 7)
        $nOffset   = DllStructGetData($pFileIconResInfo, 8)
        $pResourceIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;word", DllStructGetPtr($pGroupBuffer)+6+14*$j)
        For $k = 1 To 7
            DllStructSetData($pResourceIconResInfo, $k, DllStructGetData($pFileIconResInfo, $k))
        Next
        DllStructSetData($pResourceIconResInfo, 8, $nIcon_ID)
        $nOldPos = FileGetPos($hFile)
        FileSetPos($hFile, $nOffset, $FILE_BEGIN)
        $pNewIcon = DllStructCreate("byte[" & $nDataSize & "]")
        DllStructSetData($pNewIcon, 1, FileRead($hFile, $nDataSize))
        FileSetPos($hFile, $nOldPos, $FILE_BEGIN)       
        DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_ICON, "int", $nIcon_ID, _
                                "word", 0, "ptr", DllStructGetPtr($pNewIcon), "int", $nDataSize)
        $nIcon_ID += 1
    Next
    DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_GROUP_ICON, "int", $nGroup_ID, _
                            "word", 0, "ptr", DllStructGetPtr($pGroupBuffer), "int", DllStructGetSize($pGroupBuffer))
    $nGroup_ID += 1
    FileClose($hFile)
WEnd

DllCall("kernel32.dll", "int", "EndUpdateResource", "int", $hUpdate, "int", 0)

If $sErrFiles <> "" Then MsgBox(48, "Внимание!", "Следующие иконки не добавлены (неверный формат?):" & @CRLF & @CRLF & $sErrFiles)

Func _TCHExpandEnv($sText)
    $aResult = StringRegExp($sText, "%(\w+)%", 3)
    If IsArray($aResult) Then
        For $i = 0 To UBound($aResult)-1
            $sText = StringReplace($sText, "%" & $aResult[$i] & "%", EnvGet($aResult[$i]))
        Next
    EndIf
    Return $sText
EndFunc
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Tue Jan 26, 2010 13:53    Post subject: Reply with quote

Огромное спасибо, всё шикарно работает!
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2561

Post (Separately) Posted: Wed Jan 27, 2010 18:43    Post subject: Reply with quote

Если бы ещё перед созданием библиотеки обеспечивалась сортировка иконок по имени, было бы совсем шикарно...
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1262

Post (Separately) Posted: Wed Jan 27, 2010 21:49    Post subject: Reply with quote

sa
Да можно как угодно обрабатывать... вот вариант с сортировкой. Мне кажется, это будет иметь смысл, если иконки нумеровать.

Code:

; 1 параметр - путь к каталогу с иконками
; 2 параметр - путь библиотеки
; Требования: Autoit 3.3.4.0 (от 15.01.2010) или выше!

If $CmdLine[0] < 2 Then
    MsgBox (64, "", "Необходимо 2 параметра.")
    Exit
EndIf

Global Const $RT_ICON = 3
Global Const $RT_GROUP_ICON = 14
Global Const $FILE_BEGIN = 0
Global $nGroup_ID = 1
Global $nIcon_ID = 1
Global $sErrFiles = ""
Global $sSrcDir = _TCHExpandEnv($CmdLine[1])
Global $sNewLib = _TCHExpandEnv($CmdLine[2])
Global $aFiles[1] = [0]

Dim $bStub = "0x" & _
"4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000" & _
"000000000000000000000000B00000000E1FBA0E00B409CD21B8014CCD21546869732069732033322D62697420726573" & _
"6F7572636520646C6C2E0D0D0A0000000000000000000000240000000000000029E701DB6D866F886D866F886D866F88" & _
"AA8069886C866F8832A465886C866F88526963686D866F880000000000000000504500004C0101000CA3E83A00000000" & _
"00000000E0000F010B010600000000001000000000000000000000000002000000020000000040001000000010000000" & _
"040000000000000004000000000000001002000000020000000000000200000000001000001000000000100000100000" & _
"000000001000000000000000000000000000000000000000000200001000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000002E72737263000000" & _
"100000000002000010000000000200000000000000000000000000004000004000000000000000000000000000000000" & _
"000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000"

$hLibFile = FileOpen($sNewLib, 2 + 16)
    FileWrite($hLibFile, $bStub)
FileClose($hLibFile)

$aRet = DllCall("kernel32.dll", "int", "BeginUpdateResource", "str", $sNewLib, "int", 1)
If @error Then
    MsgBox (0, "", "Не могу открыть библиотеку.")
    Exit
EndIf
$hUpdate = $aRet[0]

$hSearch = FileFindFirstFile($sSrcDir & "\*.ico")
While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $aFiles[0] += 1
    ReDim $aFiles[$aFiles[0]+1]
    $aFiles[$aFiles[0]] = $sFile
Wend
FileClose($hSearch)

_Sort($aFiles)

For $i = 1 To $aFiles[0]
    $hFile= FileOpen($sSrcDir & "\" & $aFiles[$i], 16)

    $nReserved = Int(FileRead($hFile, 2))
    $nType     = Int(FileRead($hFile, 2))
    $nSubIcons = Int(FileRead($hFile, 2))

    If Not (($nReserved = 0) And ($nType = 1)) Then
        $sErrFiles &= $sFile & @CRLF
        ContinueLoop
    EndIf

    $pGroupBuffer = DllStructCreate("byte[" & 6 + $nSubIcons*14 & "]")
    $pGroupHeader = DllStructCreate("word;word;word", DllStructGetPtr($pGroupBuffer))
    DllStructSetData($pGroupHeader, 1, 0)
    DllStructSetData($pGroupHeader, 2, 1)
    DllStructSetData($pGroupHeader, 3, $nSubIcons)
   
    For $j = 0 to $nSubIcons - 1
        $pBuffer = DllStructCreate("byte[16]")
        DllStructSetData($pBuffer, 1, FileRead($hFile, 16))
        $pFileIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;dword", DllStructGetPtr($pBuffer))
        $nDataSize = DllStructGetData($pFileIconResInfo, 7)
        $nOffset   = DllStructGetData($pFileIconResInfo, 8)
        $pResourceIconResInfo = DllStructCreate("byte;byte;byte;byte;word;word;dword;word", DllStructGetPtr($pGroupBuffer)+6+14*$j)
        For $k = 1 To 7
            DllStructSetData($pResourceIconResInfo, $k, DllStructGetData($pFileIconResInfo, $k))
        Next
        DllStructSetData($pResourceIconResInfo, 8, $nIcon_ID)
        $nOldPos = FileGetPos($hFile)
        FileSetPos($hFile, $nOffset, $FILE_BEGIN)
        $pNewIcon = DllStructCreate("byte[" & $nDataSize & "]")
        DllStructSetData($pNewIcon, 1, FileRead($hFile, $nDataSize))
        FileSetPos($hFile, $nOldPos, $FILE_BEGIN)       
        DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_ICON, "int", $nIcon_ID, _
                                "word", 0, "ptr", DllStructGetPtr($pNewIcon), "int", $nDataSize)
        $nIcon_ID += 1
    Next
    DllCall("kernel32.dll", "int", "UpdateResource", "int", $hUpdate, "int", $RT_GROUP_ICON, "int", $nGroup_ID, _
                            "word", 0, "ptr", DllStructGetPtr($pGroupBuffer), "int", DllStructGetSize($pGroupBuffer))
    $nGroup_ID += 1
    FileClose($hFile)
Next

DllCall("kernel32.dll", "int", "EndUpdateResource", "int", $hUpdate, "int", 0)

If $sErrFiles <> "" Then MsgBox(48, "Внимание!", "Следующие иконки не добавлены (неверный формат?):" & @CRLF & @CRLF & $sErrFiles)

Func _TCHExpandEnv($sText)
    $aResult = StringRegExp($sText, "%(\w+)%", 3)
    If IsArray($aResult) Then
        For $i = 0 To UBound($aResult)-1
            $sText = StringReplace($sText, "%" & $aResult[$i] & "%", EnvGet($aResult[$i]))
        Next
    EndIf
    Return $sText
EndFunc

Func _Sort(ByRef $aStrings)
    Local $nMax = $aStrings[0], $nLast, $sTemp
    Do
        $nLast = -1
        For $i = 1 To $aStrings[0]-1
            If $aStrings[$i] > $aStrings[$i + 1] Then
                $sTemp = $aStrings[$i]
                $aStrings[$i] = $aStrings[$i + 1]
                $aStrings[$i + 1] = $sTemp
                $nLast = $i
            EndIf
        Next
        $nMax = $nLast
    Until $nLast < 0
EndFunc
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group