Loopback
|
Posted: Wed Jan 27, 2010 21:49 Post subject: |
|
|
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
|
|
|