1

Тема: JScript: Извлечение иконок из файлов ресурсов

Автор примера - Poltergeyst.
Используются библиотеки dynwrap.dll и AutoItX3.dll.

//Никаких гарантий!Используете на свой страх и риск!
//--------------------------------------------------------------------------------------------
//Данный скрипт предназначен для извлечений иконок из 
//файлов ресурсов с последующим отображением этих иконок
//в действительном контексте экрана.В данном примере
//в качестве контейнера ресурсов используется shell32.dll
//--------------------------------------------------------------------------------------------
//Примечание:Интересная возможность-в случае пустого
//параметра filename будут загружены стандартные иконки.
//--------------------------------------------------------------------------------------------
//Lang.:JScript
//Используется библиотека dynwrap.dll
//Используется вспомогательная библиотека AutoItX3.dll,v3.2.0.1
//--------------------------------------------------------------------------------------------

    IMAGE_ICON    =1
    DI_MASK         =1
    DI_IMAGE    =2
    DI_NORMAL       =3
    DI_COMPAT       =4
    DI_DEFAULTSIZE  =8
//--------------------------------------------------------------------------------------------
    //Вызов функции
    renderResourceIcon('shell32.dll')
//--------------------------------------------------------------------------------------------
function renderResourceIcon(filename)    
{
try
{

    var ghost=new ActiveXObject("AutoItX3.Control")
    ghost.sleep(100)
        ghost.WinMinimizeAll()
    ghost.sleep(100)
        ghost.mouseMove(650,20)
    ghost.sleep(100)
//--------------------------------------------------------------------------------------------
//Получение дескриптора общего контекста экрана или окна
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("USER32.DLL","GetWindowDC","i=h","f=s","r=h")
    hDC=dllWrap.GetWindowDC(0)
    dllWrap=0
    ghost.sleep(100)
//--------------------------------------------------------------------------------------------
//Загрузка библиотеки содержащей графические ресурсы
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("KERNEL32.DLL","LoadLibraryA","i=s","f=s","r=l")
    hLib=dllWrap.LoadLibraryA(filename)
    dllWrap=0
    ghost.sleep(100)
//--------------------------------------------------------------------------------------------
//Создание фоновой заливки для иконок
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("GDI32.DLL","CreateSolidBrush","i=l","f=s","r=l")
    colorRef=eval('0xfbc284')
    hBrush=dllWrap.CreateSolidBrush(colorRef)
    dllWrap=0
    ghost.sleep(100)
//--------------------------------------------------------------------------------------------
//Создание подложки
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("GDI32.DLL","Rectangle","i=luuuu","f=s","r=l")
    res=dllWrap.Rectangle(hDC,2,2,610,400)
    dllWrap=0
    ghost.sleep(100)
//--------------------------------------------------------------------------------------------
threshold=200    //Этот параметр определяет максимальное значение
        //идентификатора иконки

    for (i=0,index=1,j=0;index<threshold;index++)
    {
    //------------------------------------------------------------------------------------
    //Извлечение иконки
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("USER32.DLL","LoadImageA","i=llllll","f=s","r=l")
    hIM=dllWrap.LoadImageA(
                hLib,        //Дескриптор модуля содержащего ресурсы
                index,        //Идентификатор ресурса
                IMAGE_ICON,    //Тип загружаемого объекта
                32,        //Ширина иконки
                32,        //Высота иконки
                0)        //Параметр
    dllWrap=0
    ghost.sleep(20)
    //------------------------------------------------------------------------------------    
        if(hIM)
        {
            //Прорисовка иконки в контекст экрана или окна
            dllWrap=new ActiveXObject("DynamicWrapper")
            dllWrap.Register("USER32.DLL","DrawIconEx","i=lllllllll","f=s","r=l")
            hIM=dllWrap.DrawIconEx(
                        hDC,    //Дескриптор контекста
                        10+40*i,//Координата левого угла
                        10+40*j,//Координата левого угла
                        hIM,    //Дескриптор иконки
                        32,    //Отображаемая ширина иконки
                        32,    //Отображаемая высота иконки
                        0,    //Номер кадра AVI ресурса(не используется)
                        hBrush,    //Дескриптор фоновой заливки
                        DI_IMAGE//Дополнительный флаг
                        )
            dllWrap=0
            ghost.sleep(20)
            ghost.ToolTip(    '===========================\n'+ 
                    'Иконка номер: ['+index+']\n'+
                    '===========================',2,400)
            i++
            if (i==15){i=0;j++}
        }
    //------------------------------------------------------------------------------------
    }
    //Освобождение библиотеки из памяти
    dllWrap=new ActiveXObject("DynamicWrapper")
    dllWrap.Register("KERNEL32.DLL","FreeLibrary","i=l","f=s")
    hLib=dllWrap.FreeLibrary(hLib)
    dllWrap=0
    //------------------------------------------------------------------------------------
    //Стандартный цикл отслеживания перемещения мыши
        posX_0=ghost.MouseGetPosX()
        posY_0=ghost.MouseGetPosY()

        ghost.ToolTip(    '===========================\n'+ 
                'Чтобы убрать список иконок\n'+ 
                'сдвиньте курсор мыши на\n'+
                'достаточное расстояние\n'+
                '===========================\n',2,400)
        while (1)
        {
            posX=ghost.MouseGetPosX()
            posY=ghost.MouseGetPosY()

            if ((Math.abs(posX-posX_0)>10)||(Math.abs(posY-posY_0)>10))
            {
                ghost.send("{F5}")
                ghost.sleep(100)
                ghost.ToolTip(    '===========================\n'+ 
                        'Выполнение завершено\n'+ 
                        '===========================',2,400)
                ghost.sleep(1000)
                WScript.Quit(0)
            }
        }
//--------------------------------------------------------------------------------------------
}
    catch(err)
{
    errorHandler(err)
}

}
//--------------------------------------------------------------------------------------------
function errorHandler(err)
{
erroDesc=    "Произошла ошибка:\n"+
                "Номер:        "+err.number+'.\n'+
                "Описание:    "+err.description+'.'
        WScript.Echo(erroDesc)
        WScript.Quit(0)
}
//--------------------------------------------------------------------------------------------
//Примерно таким же путем,при создании скриптовых проектов,возможно извлекать из файлов 
//ресурсов курсоры и графические изображения.
//--------------------------------------------------------------------------------------------
//poltergeyst
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.