Авторские статьи создание инстоллятора для микро-программ

Discussion in 'Статьи' started by DooD, 29 Jan 2012.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    Приветствую господа античатовцы.
    Недавно наткнулся на статью где описывалось создание инсталла для WIN 9X.
    Заинтересовавшись я решил сделать свой для NT систем.
    Суть заключается в написании просто inf файла который установит нашу маленькую программу.Почему не взять нормальные программы для создания инсталл пакетов?Да они хороши,но для больших программ,для маленькой не оправдает средства.
    Ближе к делу.
    Что понадобится (инструменты)
    1)Любой текстовый редактор.Я юзаю notepad++
    2)Файлы установки.Подопытной взял Одну интересную прогу SLESH'a, ссылка на топ https://forum.antichat.ru/showthread.php?p=2199120
    3)Любой компилируемый язык программирования работающий с api функциями.(я использовал assembler)

    начнем

    Итак я буду писать код inf файла и раскоментирую все подробно.
    Создаем заголовок

    Code:
     
    [Version]
    Signature=$Chicago$
    
    сигнатура $chicago$ говорит о том что установка может проводиться на всей линейке ос MS WIN

    Code:
    [strings]
    APP_NAME="Slil_ru_file_uploader"
    DIR="Progra~1\slil" 
    
    Эта секция зарезервирована и должна только так называться.Она содержит название приложения и путь для установки.

    Code:
    [SourceDisksNames] 
    1 = %APP_NAME%,"",1
    
    Имя диска установки.
    Читается из секции [strings]

    Code:
     
    [SourceDisksFiles]
    install.inf=1
    slil.exe=1
    help.txt=1
    
    Это файлы которые будут копироваться.

    Code:
    [Optional Components]
    DefaultInstall
    
    стандартная установка (не обяз.)

    описуем секцию установки

    Code:
     
    [DefaultInstall]
    CopyFiles = CopyINFfiles,mainfiles 
    UpdateInis = AddShortcuts
    AddReg = AddUninstall
    ProfileItems  =AddShortcut
    

    CopyFiles- файлы для копирования
    UpdateInis = AddShortcuts- создание ярлыков
    AddReg = AddUninstall- внесение информации в реестр (удаление будет происходить через апплет установка и удаления программ)

    ProfileItems =AddShortcut - также создание/удаление ярлыков,только в разных группах

    Code:
    [DefaultUninstall]
    BeginPrompt = BeginUPromptSection
    DelFiles = CopyINFfiles,mainfiles 
    UpdateInis = DelShortcuts
    DelReg = DelUninstall
    EndPrompt = UninstallEndPrompt
    ProfileItems  =DelShortcut 
    
    а это у нас секция удаления.

    BeginPrompt = BeginUPromptSection тут мы выводим сообщение о подтверждении удаления программы
    DelFiles = CopyINFfiles,mainfiles -собсна,удаляем скопированные файлы
    UpdateInis = DelShortcuts,ProfileItems =DelShortcut -удаляем ярлыки
    DelReg = DelUninstall -удаляем ключи
    EndPrompt = UninstallEndPrompt выводим конечное сообщение.

    Code:
    [AddShortcut]
    Name       = "zalil",0x00000008,9
    CmdLine    = 16422,"slil",slil.exe
    [DelShortcut]
    Name       = "Zalil",0x0000000A,9 
    
    Вот отличительное свойство.В своем треде Slesh писал что было бы удобно кинуть файл в send_to чтобы отправлять быстрее было.Установщик сделает это сам.
    Что тут что значит:
    name= "zalil" -что будет отображаться
    ,0x00000008,9="%UserProfile%\SendTo" то-бишь создаем ярлык там.
    CmdLine = 16422,"slil",slil.exe Cmdline -путь к исполняемому файлу с парам. ProgramFiles.+ имя экзэшника.Соотв.и удаляем его же.

    Code:
    [DestinationDirs]
    mainfiles=24,%DIR%
    CopyINFfiles =17
    
    Каталог назначения (что куда копировать)
    в секции главных файлов (будет дальше) копируем в програм файлс. Путь как в ДОС 8 символов два последних ~1
    CopyINFfiles =17 каждая директория диска имеет номер 17- C:\windows\inf
    помещаем туда наш установочный файл,который будет использован апллетом для удаления файлов и инф.

    Code:
    [CopyINFfiles]
    install.inf,,,1
    
    [mainfiles]
    slil.exe
    help.txt
     
    секции с файлами

    Code:
     
    [AddShortcuts]
    setup.ini, progman.groups,, "group1=""%APP_NAME%"""
    setup.ini, group1,, """SlilFU"",""""""%24%\Progra~1\slil\slil.exe"""""",,,,""%24%\Progra~1\slil"",""slil.exe"""
    
    Создаем ярлык в программной группе в пуск

    Code:
     
    [DelShortcuts]
    setup.ini, progman.groups,, "group1=""%APP_NAME%"""
    setup.ini, group1,, """SlilFU"""
    
    удаляем.

    Code:
     
    [AddUninstall]
    HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%APP_NAME%","DisplayName",,"slil_ru_FU"
    
    HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%APP_NAME%","UninstallString",,"RunDll32 advpack.dll,LaunchINFSection %17%\install.inf, DefaultUninstall"
    
    Вносим инфу в реестр.1)Сдесь будет отображаться текст в апллете.
    2)Запускается секция [DefaultUninstall]
    дело в том что в венде имеется два интерпретатора inf файлов это setupapi и advpack оба находятся в динамических библиотеках,каждый имеет свои параметры
    %17%...ю я описывал выше,тут запустится наш инсталл файл из C:\windows\inf

    Code:
     
    [DelUninstall]
    HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%APP_NAME%"
    
    удаление ключа.

    Code:
     
    [BeginUPromptSection]
    Prompt = "Вы действительно хотите удалить программу?"
    ButtonType = YESNO 
    Title = Удаление...
    
    [UninstallEndPrompt]
    Prompt = "Программа успешно удалена!"
    
    Сообщения при деинсталяции.

    Вот собсно и все.
    Только вот по дефолту инф файлы открываются блокнотом,по этому не помешало бы написать микро-лаунчер.я буду делать на ассемблере
    пояснения(хах,там вызов 3-4 функций:))в коментах

    Code:
     
    ;This program was created in assembler editor
    .386
    .model flat,stdcall
    option casemap:none
    
    include include\windows.inc
    include include\shell32.inc
    include include\kernel32.inc
    include include\user32.inc
    include macros\macros.asm
    
    includelib lib\kernel32.lib
    includelib lib\shell32.lib
    includelib lib\user32.lib
    .code
    
    start:
    invoke GetFileAttributes,CTXT("setup\install.inf") ; проверяем наличие установочного файла
    .IF eax==INVALID_FILE_ATTRIBUTES ; если возврат INVALID_FILE_ATTRIBUTES то файла не существует
    invoke MessageBox,0,CTXT("Файл установки отсутствует!"),0,0 ; известим об этом
    .ELSE
    invoke ShellExecute,0,CTXT("install"),CTXT("setup\install.inf"),0,0,SW_SHOW ; иначе устанавливаем наш файл
    .ENDIF
    invoke ExitProcess,0
    
    end start
    
    после компиляции с сжатия FSG получаем ланчер в 877 байт.
    помещаем инстал файлы в папку setup, а install.exe снаружи.
    Программа Slesh'a весит 7,5 кб
    inf файл 1,85 кб
    help.txt 943 байта
    install.exe 877 байт

    размер дистрибутива > устанавливаемой программы на 3707 байт.

    кладем все через hamster в 7Z и получаем установочник весом 5,03 кб то есть даже меньше чем исходная программа.
    Также inf файлы широко применяются у мелкомягких в установке программ и драйверов.

    Спасибо за внимание ,надеюсь кому то было интересно.
     
    #1 DooD, 29 Jan 2012
    Last edited: 29 Jan 2012
    2 people like this.
  2. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Спасибо. Я обычно на дельфе с помощью реестра извращаюсь, когда инсталл пакет делаю. Теперь буду знать новый способ ;)