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 

Single Post  Topic: Автоматическое создание из папки с иконками библиотеки DLL 
Author Message
Loopback



PostPosted: 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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group