View previous topic :: View next topic |
Author |
Message |
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Fri Jan 22, 2010 03:20 Post subject: Автоматическое создание из папки с иконками библиотеки DLL |
|
|
Есть папка с иконками, которая переодически меняется, добавляется
Как автоматически создавать из этой папки (этих иконок) библиотеку dll?
1. Можно с помощью стороннего софта, но надо открыть прогу, и...
2. Использовать плагин ICLRead.wcx, но надо открыть исходную папку, и куда создавать, и ещё дополнительные нажимания
(переименование из icl в dll...)
Есть ли возможность одним нажатием
либо используя возможность командной строки какой-либо утилиты, либо плагин как-то использовать... Подскажите?
! | Avada: | Три ошибки в одном заголовке — это многовато. Поправил. Поаккуратнее, пожалуйста. | |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Fri Jan 22, 2010 16:08 Post subject: |
|
|
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 |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Fri Jan 22, 2010 22:02 Post subject: |
|
|
Еще вариант, на 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 |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Sun Jan 24, 2010 01:13 Post subject: |
|
|
Loopback можно ли поподробнее спараметрами и подскажи что такое WinAPI. Я пытался вставить параметры, но что-то не выходит |
|
Back to top |
|
|
Samwatas
Joined: 12 Sep 2009 Posts: 95
|
(Separately) Posted: Sun Jan 24, 2010 22:16 Post subject: |
|
|
Вызываешь скомпилированный экзешник из тотала с двумя параметрами командной строки:
первый параметр - %P (тут тотал подставит нужное значение)
второй параметр - <имя dll> (пишешь имя создаваемой длл, лучше с полным путём)
Всё это можно прописать в кнопке. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Sun Jan 24, 2010 22:57 Post subject: |
|
|
Samwatas
Немного опередил
Andrey_A
Все что написал Samwatas верно, только компилировать необязательно - можно задать путь в виде:
Code: |
Команда: <путь к Autoit>\autoit3.exe <путь к скрипту>\<имя скрипта>.au3
Параметры: %P <имя dll>
|
У меня, например, в каталоге тотала создан каталог Scripts, там лежит экзешник Autoit и скрипты - компактно (скрипты маленькие) и полностью портабельно, удобно в кнопках использовать с %COMMANDER_PATH%.
По поводу WinAPI. Это инструментарий разработчика в Windows, в данном случае имелся в виду вызов функций добавления ресурсов. Autoit - скриптовый язык, с весьма большим, но конечным количеством встроенных функций. Когда их не хватает, можно прибегнуть к вызову функций ОС. |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Mon Jan 25, 2010 02:23 Post subject: |
|
|
Вставил параметры, но выдало dll очень маленького размера, без библиотеки
может у меня не та версия AutoIt3, у меня 3.3.0.0. , если нужна новее, дайте пожалуйста ссылку |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Mon Jan 25, 2010 12:23 Post subject: |
|
|
Да, я же писал требования - версия только 3.3.4.0 и выше (в ней добавлено позиционирование в файле, что очень упростило код).
Скачать можно тут:
http://www.autoitscript.com/autoit3/downloads.shtml
Первая ссылка в таблице - инсталлятор, третья - самораспаковывающийся архив. Кому что удобнее. |
|
Back to top |
|
|
Samwatas
Joined: 12 Sep 2009 Posts: 95
|
(Separately) Posted: Mon Jan 25, 2010 21:05 Post subject: |
|
|
Loopback wrote: | только компилировать необязательно |
Мне кажется екзешник будет удобнее (нет привязки к установке АвтоИта - можно положить в папку с портативным Тоталом).
Ну тут, как говорится, о вкусах не спорят. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Mon Jan 25, 2010 22:00 Post subject: |
|
|
Samwatas wrote: | Мне кажется екзешник будет удобнее (нет привязки к установке АвтоИта - можно положить в папку с портативным Тоталом). |
Так привязки и не нужно - Autoit это единственный экзешник, который как раз и можно положить в каталог с тоталом, никакой инсталляции, записей в реестре и т.д - портативнее не придумаешь Всё остальное, что идет с ним в дистрибутиве - вспомогательные библиотеки на все случаи жизни, справка, инструменты и т.д. - совершенно необязательно для работы.
В принципе, если скрипт один - можно скомпилировать и забыть. Если же их планируется несколько - имхо разумнее оставить экзешник отдельно, и место экономится, и подправить скрипт, если что, просто. |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Jan 26, 2010 03:58 Post subject: |
|
|
Скачал нужную версию, как я не пытался..., но всё же получилось создать библиотеку, но только тогда когда я в папке выделил все иконки и нажал кнопку скрипта с параметрами "%P" 1.dll.
Можно ли сделать библиотеку не входя в папку и не выделяя иконки, прописав просто путь к папке %COMMANDER_PATH%\Files\Icons\Wcmicons\
и ещё не срабатывает второй параметр, если вписываешь переменную "%%COMMANDER_PATH%%\Wcmicons.dll"
можно ли удалять библиотеку, если она есть из пути 2-го параметра |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Tue Jan 26, 2010 11:35 Post subject: |
|
|
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 |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Jan 26, 2010 13:53 Post subject: |
|
|
Огромное спасибо, всё шикарно работает! |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2571
|
(Separately) Posted: Wed Jan 27, 2010 18:43 Post subject: |
|
|
Если бы ещё перед созданием библиотеки обеспечивалась сортировка иконок по имени, было бы совсем шикарно... |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) 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
|
|
|
Back to top |
|
|
|
|
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
|