Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как создать установочный exe файл


Как сделать установочный файл EXE

Что вы делаете, когда вы создали какое-то новое программное обеспечение Windows — что угодно из простого диагностического инструмента

в сложную компьютерную видеоигру

— а ты хочешь поделиться этим с миром? Ну, вы можете сжать файлы в один ZIP-файл и распространять его.

Или вы можете быть модным и вместо этого создать установщик EXE.

В этом посте мы рассмотрим три различных метода: самораспаковывающийся пакет, простой установщик, использующий встроенный IExpress, и расширенный установщик, использующий настраиваемую установку Inno.

Быстрый метод: использование 7-Zip

Вы, вероятно, уже используете 7-Zip для извлечения всех видов архивных файлов

и вы, вероятно, уже знаете, что 7-Zip может создавать архивные файлы, но знаете ли вы, что вы также можете использовать его для создания EXE-файла, который действует как установщик?

Это называется Архив SFX («Самораспаковывающийся») и работает, сжимая все ваши конечные файлы вместе, а затем встраивая специальный архив EXE в архив, который знает, как извлечь все. Другими словами, получатель может извлечь архив SFX (который выглядит как сам файл EXE), даже если у него нет подходящего программного обеспечения, что может случиться с такими форматами, как 7Z, RAR, TAR и ZIP.

Как создать свой собственный SFX-архив с 7-Zip:

  1. Подготовьте все свои файлы и каталоги в одном главном каталоге и назовите каталог по своему усмотрению.
  2. Нажмите правой кнопкой мыши на каталог и выберите 7-Zip> Добавить в архив…
  3. Под опциями включите Создать SFX архив и выберите следующие настройки …
    > Формат архива: 7z
    >
    Уровень сжатия: Нормальный
    >
    Метод сжатия: LZMA2
    >
    Размер словаря: 16 МБ

    он активно разрабатывался с 1997 года. Он был создан частично в ответ на актуальный неполный уровень InstallShield Express. С тех пор он стал создателем инсталляторов для тех, кто не хочет исследовать собственные опции.

    Его самая большая ничья — это гибкость. Inno Setup использует файлы сценариев с расширением ISS («Inno Setup Script») для настройки различных аспектов программы установки: какие файлы включены, где происходит установка, создавать ли ярлыки и т. Д. Файлы ISS используют форматирование, подобное формату файлов INI. и может быть создан с помощью мастера установки Inno.

    Как создать свой собственный установщик с помощью Inno Setup:

    1. Запустите приложение Inno Setup Compiler.
    2. В окне приветствия выберите Создайте новый файл сценария с помощью мастера сценариев.
    3. Введите имя приложения и версию приложения. При желании вы также можете указать сведения об издателе приложения и веб-сайте приложения. Нажмите следующий.
    4. Выберите Основная папка назначения, который по умолчанию для программных файлов. Введите Имя папки приложения, Это имя главного каталога, куда будут идти ваши установочные файлы. Нажмите следующий.
    5. За Основной исполняемый файл приложения, найдите и выберите основной EXE-файл, который запустит ваше приложение. Если вы не устанавливаете приложение, включите Приложение не имеет основного исполняемого файла. Затем добавьте файлы и папки в вашу установку с помощью Добавить файлы… а также Добавить папки … кнопок. Нажмите следующий.
    6. На странице «Ярлыки приложений» оставьте значения по умолчанию или измените их в соответствии со своими предпочтениями. Они все говорят сами за себя. Нажмите следующий.
    7. На странице документации приложения вы можете указать до трех TXT-файлов, которые будут отображаться в процессе установки конечного пользователя. Обычно это LICENSE.TXT, INSTALL.TXT и README.TXT, но они могут быть любыми. Нажмите следующий.
    8. На странице «Настройка языков» сохраните английский но не стесняйтесь добавлять столько языков, сколько пожелаете. Нажмите следующий.
    9. На странице «Настройки компилятора» вы можете настроить EXE-файл установщика:
      > Пользовательская папка вывода компилятора где будет находиться полученный установочный EXE-файл.
      > Имя выходного файла компилятора это то, что файл EXE будет называться. Значением по умолчанию является setup.exe.
      > Файл настроек пользовательской настройки это значок, который будет использоваться для установочного EXE-файла. Это должен быть файл ICO, который вы можете скачать или конвертировать из PNG

      ,

    10. Настроить пароль защитит неавторизованных пользователей от использования вашего установщика. Оставьте это поле пустым, чтобы отключить эту функцию.
    11. Нажмите Конец. Когда будет предложено скомпилировать новый скрипт, нажмите да. Когда будет предложено сохранить скрипт, выберите нет если это одноразовый установочный файл или выберите да если вы планируете изменить или обновить его позже. Готово!

    Скачать — Inno Setup (бесплатно)

    Какой метод подходит вам?

    Если ваше программное обеспечение очень простое или вы собираетесь распространять его среди ограниченного числа людей, используйте метод 7-Zip. Это просто, быстро и практически не требует технических знаний.

    Если ваше программное обеспечение несколько простое и вы хотите представить конечного пользователя настоящий мастер установки, воспользуйтесь методом IExpress.

    Если у вас сложное программное обеспечение и у вас за плечами большой технический опыт, воспользуйтесь методом Inno Setup. Он самый гибкий, самый мощный и не страдает от проблем, которые мешают IExpress.

    Какой метод вы будете использовать? Есть ли другие методы, которые мы пропустили? Дайте нам знать в комментариях ниже!

    Изображение предоставлено: sdecoret, DaGa5 через Shutterstock.com

Создаем EXE / Хабр

Самоизоляция это отличное время приступить к тому, что требует много времени и сил. Поэтому я решил заняться тем, чем всегда хотел — написать свой компилятор.

Сейчас он способен собрать Hello World, но в этой статье я хочу рассказать не про парсинг и внутреннее устройство компилятора, а про такую важную часть как побайтовая сборка exe файла.

Начало


Хотите спойлер? Наша программа будет занимать 2048 байт.

Обычно работа с exe файлами заключается в изучении или модификации их структуры. Сами же исполняемые файлы при этом формируют компиляторы, и этот процесс кажется немного магическим для разработчиков.

Но сейчас мы с вами попробуем это исправить!

Для сборки нашей программы нам потребуется любой HEX редактор (лично я использовал HxD).

Для старта возьмем псевдокод:

Исходный код
func MessageBoxA(u32 handle, PChar text, PChar caption, u32 type) i32 ['user32.dll'] func ExitProcess(u32 code) ['kernel32.dll'] func main() { MessageBoxA(0, 'Hello World!', 'MyApp', 64) ExitProcess(0) } 


Первые две строки указывают на функции импортируемые из библиотек WinAPI. Функция MessageBoxA выводит диалоговое окно с нашим текстом, а ExitProcess сообщает системе о завершении программы.
Рассматривать отдельно функцию main нет смысла, так как в ней используются функции, описанные выше.

DOS Header


Для начала нам нужно сформировать корректный DOS Header, это заголовок для DOS программ и влиять на запуск exe под Windows не должен.

Более-менее важные поля я отметил, остальные заполнены нулями.

Стуктура IMAGE_DOS_HEADER
Struct IMAGE_DOS_HEADER { u16 e_magic // 0x5A4D "MZ" u16 e_cblp // 0x0080 128 u16 e_cp // 0x0001 1 u16 e_crlc u16 e_cparhdr // 0x0004 4 u16 e_minalloc // 0x0010 16 u16 e_maxalloc // 0xFFFF 65535 u16 e_ss u16 e_sp // 0x0140 320 u16 e_csum u16 e_ip u16 e_cs u16 e_lfarlc // 0x0040 64 u16 e_ovno u16[4] e_res u16 e_oemid u16 e_oeminfo u16[10] e_res2 u32 e_lfanew // 0x0080 128 } 


Самое главное, что этот заголовок содержит поле e_magic означающее, что это исполняемый файл, и e_lfanew — указывающее на смещение PE-заголовка от начала файла (в нашем файле это смещение равно 0x80 = 128 байт).

Отлично, теперь, когда нам известна структура заголовка DOS Header запишем ее в наш файл.

(1) RAW DOS Header (Offset 0x00000000)
4D 5A 80 00 01 00 00 00 04 00 10 00 FF FF 00 00 40 01 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 



Уточнение

Сначала я использовал левую колонку как на скриншоте для указания смещения внутри файла, но тогда неудобно копировать исходный текст, приходится обрезать каждую строку.

Поэтому для удобства в первой скобке каждого блока указан порядок добавления в файл, а в последней смещение в файле (Offset) по которому должен располагаться данный блок.

Например, первый блок мы вставляем по смещению 0x00000000, и он займет 64 байта (0x40 в 16-ричной системе), следующий блок мы будем вставлять уже по этому смещению 0x00000040 и т.д.

Готово, первые 64 байта записали. Теперь нужно добавить еще 64, это так называемый DOS Stub (Заглушка). Во время запуска из-под DOS, она должна уведомить пользователя что программа не предназначена для работы в этом режиме.

Но в целом, это маленькая программа под DOS которая выводит строку и выходит из программы.
Запишем наш Stub в файл и рассмотрим его детальнее.

(2) RAW DOS Stub (Offset 0x00000040)
0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 6D 6F 64 65 2E 0D 0A 24 00 00 00 00 00 00 00 00 



А теперь этот же код, но уже в дизассемблированном виде Asm DOS Stub
0000 push cs ; Запоминаем Code Segment(CS) (где мы находимся в памяти) 0001 pop ds ; Указываем что Data Segment(DS) = CS 0002 mov dx, 0x0E ; Указываем адрес начала строки DS+DX, которая будет выводиться до символа $(Конец строки) 0005 mov ah, 0x09 ; Номер инструкции (Вывод строки) 0007 int 0x21 ; Вызов системного прерывания 0x21 0009 mov ax, 0x4C01 ; Номер инструкции 0x4C (Выход из программы) ; Код выхода из программы 0x01 (Неудача) 000c int 0x21 ; Вызов системного прерывания 0x21 000e "This program cannot be run in DOS mode.\x0D\x0A$" ; Выводимая строка 


Это работает так: сначала заглушка выводит строку о том, что программа не может быть запущена, а затем выходит из программы с кодом 1. Что отличается от нормального завершения (Код 0).

Код заглушки может немного отличатся (от компилятора к компилятору) я сравнивал gcc и delphi, но общий смысл одинаковый.

А еще забавно, что строка заглушки заканчивается как \x0D\x0D\x0A$. Скорее всего причина такого поведения в том, что c++ по умолчанию открывает файл в текстовом режиме. В результате символ \x0A заменяется на последовательность \x0D\x0A. В результате получаем 3 байта: 2 байта возврата каретки Carriage Return (0x0D) что бессмысленно, и 1 на перевод строки Line Feed (0x0A). В бинарном режиме записи (std::ios::binary) такой подмены не происходит.

Для проверки корректности записи значений я буду использовать Far с плагином ImpEx:

NT Header


Спустя 128 (0x80) байт мы добрались до NT заголовка (IMAGE_NT_HEADERS64), который содержит в себе и PE заголовок (IMAGE_OPTIONAL_HEADER64). Несмотря на название IMAGE_OPTIONAL_HEADER64 является обязательным, но различным для архитектур x64 и x86. Структура IMAGE_NT_HEADERS64
Struct IMAGE_NT_HEADERS64 { u32 Signature // 0x4550 "PE" Struct IMAGE_FILE_HEADER { u16 Machine // 0x8664 архитектура x86-64 u16 NumberOfSections // 0x03 Количество секций в файле u32 TimeDateStamp // Дата создания файла u32 PointerToSymbolTable u32 NumberOfSymbols u16 SizeOfOptionalHeader // Размер IMAGE_OPTIONAL_HEADER64 (Ниже) u16 Characteristics // 0x2F } Struct IMAGE_OPTIONAL_HEADER64 { u16 Magic // 0x020B Указывает что наш заголовок для PE64 u8 MajorLinkerVersion u8 MinorLinkerVersion u32 SizeOfCode u32 SizeOfInitializedData u32 SizeOfUninitializedData u32 AddressOfEntryPoint // 0x1000 u32 BaseOfCode // 0x1000 u64 ImageBase // 0x400000 u32 SectionAlignment // 0x1000 (4096 байт) u32 FileAlignment // 0x200 u16 MajorOperatingSystemVersion // 0x05 Windows XP u16 MinorOperatingSystemVersion // 0x02 Windows XP u16 MajorImageVersion u16 MinorImageVersion u16 MajorSubsystemVersion // 0x05 Windows XP u16 MinorSubsystemVersion // 0x02 Windows XP u32 Win32VersionValue u32 SizeOfImage // 0x4000 u32 SizeOfHeaders // 0x200 (512 байт) u32 CheckSum u16 Subsystem // 0x02 (GUI) или 0x03 (Console) u16 DllCharacteristics u64 SizeOfStackReserve // 0x100000 u64 SizeOfStackCommit // 0x1000 u64 SizeOfHeapReserve // 0x100000 u64 SizeOfHeapCommit // 0x1000 u32 LoaderFlags u32 NumberOfRvaAndSizes // 0x16 Struct IMAGE_DATA_DIRECTORY [16] { u32 VirtualAddress u32 Size } } } 


Разберемся что хранится в этой структуре: Описание IMAGE_NT_HEADERS64 Signature — Указывает на начало структуры PE заголовка

Далее идет заголовок IMAGE_FILE_HEADER общий для архитектур x86 и x64.

Machine — Указывает для какой архитектуры предназначен код в нашем случае для x64
NumberOfSections — Количество секции в файле (О секциях чуть ниже)
TimeDateStamp — Дата создания файла
SizeOfOptionalHeader — Указывает размер следующего заголовка IMAGE_OPTIONAL_HEADER64, ведь он может быть заголовком IMAGE_OPTIONAL_HEADER32.

Characteristics — Здесь мы указываем некоторые атрибуты нашего приложения, например, что оно является исполняемым (EXECUTABLE_IMAGE) и может работать более чем с 2 Гб RAM (LARGE_ADDRESS_AWARE), а также что некоторая информация была удалена (на самом деле даже не была добавлена) в файл (RELOCS_STRIPPED | LINE_NUMS_STRIPPED | LOCAL_SYMS_STRIPPED).

SizeOfCode — Размер исполняемого кода в байтах (секция .text)
SizeOfInitializedData — Размер инициализированных данных (секция .rodata)
SizeOfUninitializedData — Размер не инициализированных данных (секция .bss)
BaseOfCode — указывает на начало секции кода блок
SectionAlignment — Размер по которому нужно выровнять секции в памяти
FileAlignment — Размер по которому нужно выровнять секции внутри файла
SizeOfImage — Размер всех секций программы
SizeOfHeaders — Размер всех заголовков вместе (IMAGE_DOS_HEADER, DOS Stub, IMAGE_NT_HEADERS64, IMAGE_SECTION_HEADER[IMAGE_FILE_HEADER.NumberOfSections]) выровненный по FileAlignment
Subsystem — Указывает тип нашей программы GUI или Console
MajorOperatingSystemVersion, MinorOperatingSystemVersion, MajorSubsystemVersion, MinorSubsystemVersion — Говорят о том на какой системе можно запускать данный exe, и что он может поддерживать. В нашем случае мы берем значение 5.2 от Windows XP (x64).
SizeOfStackReserve — Указывает сколько приложению нужно зарезервировать памяти под стек. Этот параметр по умолчанию составляет 1 Мб, максимально можно указать 1Гб. Вроде как умные программы на Rust умеют считать необходимый размер стека, в отличии от программ на C++ где этот размер нужно править вручную.
SizeOfStackCommit — Размер по умолчанию составляет 4 Кб. Как должен работать данный параметр пока не разобрался.
SizeOfHeapReserve — Указывает сколько резервировать памяти под кучу. Равен 1 Мб по умолчанию.
SizeOfHeapCommit — Размер по умолчанию равен 4 Кб. Подозреваю что работает аналогично SizeOfStackCommit, то есть пока неизвестно как.

IMAGE_DATA_DIRECTORY — массив записей о каталогах. В теории его можно уменьшить, сэкономив пару байт, но вроде как все описывают все 16 полей даже если они не нужны. А теперь чуть подробнее.

У каждого каталога есть свой номер, который описывает, где хранится его содержимое. Пример:
Export(0) — Содержит ссылку на сегмент который хранит экспортируемые функции. Для нас это было бы актуально если бы мы создавали DLL. Как это примерно должно работать можно посмотреть на примере следующего каталога.

Import(1) — Этот каталог указывает на сегмент с импортируемыми функциями из других DLL. В нашем случае значения VirtualAddress = 0x3000 и Size = 0xB8. Это единственный каталог, который мы опишем.

Resource(2) — Каталог с ресурсами программы (Изображения, Текст, Файлы и т.д.)
Значения других каталогов можно посмотреть в документации.


Теперь, когда мы посмотрели из чего состоит NT-заголовок, запишем и его в файл по аналогии с остальными по адресу 0x80. (3) RAW NT-Header (Offset 0x00000080)
50 45 00 00 64 86 03 00 F4 70 E8 5E 00 00 00 00 00 00 00 00 F0 00 2F 00 0B 02 00 00 3D 00 00 00 13 00 00 00 00 00 00 00 00 10 00 00 00 10 00 00 00 00 40 00 00 00 00 00 00 10 00 00 00 02 00 00 05 00 02 00 00 00 00 00 05 00 02 00 00 00 00 00 00 40 00 00 00 02 00 00 00 00 00 00 02 00 00 00 00 00 10 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 


В результате получаем вот такой вид IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER64 и IMAGE_DATA_DIRECTORY заголовков:

Далее описываем все секции нашего приложения согласно структуре IMAGE_SECTION_HEADER

Структура IMAGE_SECTION_HEADER
Struct IMAGE_SECTION_HEADER { i8[8] Name u32 VirtualSize u32 VirtualAddress u32 SizeOfRawData u32 PointerToRawData u32 PointerToRelocations u32 PointerToLinenumbers u16 NumberOfRelocations u16 NumberOfLinenumbers u32 Characteristics } 


Описание IMAGE_SECTION_HEADER

Name — имя секции из 8 байт, может быть любым
VirtualSize — сколько байт копировать из файла в память
VirtualAddress — адрес секции в памяти выровненный по SectionAlignment
SizeOfRawData — размер сырых данных выровненных по FileAlignment
PointerToRawData — адрес секции в файле выровненный по FileAlignment
Characteristics — Указывает какие данные хранит секция (Код, инициализированные или нет данные, для чтения, для записи, для исполнения и др.)


В нашем случае у нaс будет 3 секции.

Почему Virtual Address (VA) начинается с 1000, а не с нуля я не знаю, но так делают все компиляторы, которые я рассматривал. В результате 1000 + 3 секции * 1000 (SectionAlignment) = 4000 что мы и записали в SizeOfImage. Это полный размер нашей программы в виртуальной памяти. Вероятно, используется для выделения места под программу в памяти.

 Name | RAW Addr | RAW Size | VA | VA Size | Attr --------+---------------+---------------+-------+---------+-------- .text | 200 | 200 | 1000 | 3D | CER .rdata | 400 | 200 | 2000 | 13 | I R .idata | 600 | 200 | 3000 | B8 | I R 

Расшифровка атрибутов:

I — Initialized data, инициализированные данные
U — Uninitialized data, не инициализированные данные
C — Code, содержит исполняемый код
E — Execute, позволяет исполнять код
R — Read, позволяет читать данные из секции
W — Write, позволяет записывать данные в секцию

.text (.code) — хранит в себе исполняемый код (саму программу), атрибуты CE
.rdata (.rodata) — хранит в себе данные только для чтения, например константы, строки и т.п., атрибуты IR
.data — хранит данные которые можно читать и записывать, такие как статические или глобальные переменные. Атрибуты IRW
.bss — хранит не инициализированные данные, такие как статические или глобальные переменные. Кроме того, данная секция обычно имеет нулевой RAW размер и ненулевой VA Size, благодаря чему не занимает места в файле. Атрибуты URW
.idata — секция содержащая в себе импортируемые из других библиотек функции. Атрибуты IR

Важный момент, секции должны следовать друг за другом. При чем как в файле, так и в памяти. По крайней мере когда я менял их порядок произвольно программа переставала запускаться.

Теперь, когда нам известно какие секции будет содержать наша программа запишем их в наш файл. Тут смещение оканчивается на 8 и запись будет начинаться с середины файла.

(4) RAW Sections (Offset 0x00000188)
 2E 74 65 78 74 00 00 00 3D 00 00 00 00 10 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 2E 72 64 61 74 61 00 00 13 00 00 00 00 20 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 2E 69 64 61 74 61 00 00 B8 00 00 00 00 30 00 00 00 02 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 



Следующий адрес для записи будет 00000200 что соответствует полю SizeOfHeaders PE-Заголовка. Если бы мы добавили еще одну секцию, а это плюс 40 байт, то наши заголовки не уложились бы в 512 (0x200) байт и пришлось бы использовать уже 512+40 = 552 байта выровненные по FileAlignment, то есть 1024 (0x400) байта. А все что останется от 0x228 (552) до адреса 0x400 нужно чем-то заполнить, лучше конечно нулями.

Взглянем как выглядит блок секций в Far:

Далее мы запишем в наш файл сами секции, но тут есть один нюанс.

Как вы могли заметить на примере SizeOfHeaders, мы не можем просто записать заголовок и перейти к записи следующего раздела. Так как что бы записать заголовок мы должны знать сколько займут все заголовки вместе. В результате нам нужно либо посчитать заранее сколько понадобиться места, либо записать пустые (нулевые) значения, а после записи всех заголовков вернуться и записать уже их реальный размер.

Поэтому программы компилируются в несколько проходов. Например секция .rdata идет после секции .text, при этом мы не можем узнать виртуальный адрес переменной в .rdata, ведь если секция .text разрастется больше чем на 0x1000 (SectionAlignment) байт, она займет адреса 0x2000 диапазона. И соответственно секция .rdata будет находиться уже не в адресе 0x2000, а в адресе 0x3000. И нам будет необходимо вернуться и пересчитать адреса всех переменных в секции .text которая идет перед .rdata.

Но в данном случае я уже все рассчитал, поэтому будем сразу записывать блоки кода.

Секция .text


Asm segment .text
0000 push rbp 0001 mov rbp, rsp 0004 sub rsp, 0x20 0008 mov rcx, 0x0 000F mov rdx, 0x402000 0016 mov r8, 0x40200D 001D mov r9, 0x40 0024 call QWORD PTR [rip + 0x203E] 002A mov rcx, 0x0 0031 call QWORD PTR [rip + 0x2061] 0037 add rsp, 0x20 003B pop rbp 003C ret 


Конкретно для этой программы первые 3 строки, ровно, как и 3 последние не обязательны.
Последние 3 даже не будут исполнены, так как выход из программы произойдет еще на второй функции call.

Но скажем так, если бы это была не функция main, а подфункция следовало бы сделать именно так.

А вот первые 3 в данном случае хоть и не обязательны, но желательны. Например, если бы мы использовали не MessageBoxA, а printf то без этих строк получили бы ошибку.

Согласно соглашению о вызовах для 64-разрядных систем MSDN, первые 4 параметра передаются в регистрах RCX, RDX, R8, R9. Если они туда помещаются и не являются, например числом с плавающей точкой. А остальные передаются через стек.

По идее если мы передаем 2 аргумента функции, то должны передать их через регистры и зарезервировать под них два места в стеке, что бы при необходимости функция могла скинуть регистры в стек. Так же мы не должны рассчитывать, что нам вернут эти регистры в исходном состоянии.

Так вот проблема функции printf заключается в том, что, если мы передаем ей всего 1 аргумент, она все равно перезапишет все 4 места в стеке, хотя вроде бы должна перезаписать только одно, по количеству аргументов.

Поэтому если не хотите, чтобы программа себя странно вела, всегда резервируйте как минимум 8 байт * 4 аргумента = 32(0x20) байт, если передаете функции хотя бы 1 аргумент.

Рассмотрим блок кода с вызовами функций

MessageBoxA(0, 'Hello World!', 'MyApp', 64) ExitProcess(0) 

Сначала мы передаем наши аргументы:

rcx = 0
rdx = абсолютный адрес строки в памяти ImageBase + Sections[".rdata"].VirtualAddress + Смещение строки от начала секции, строка читается до нулевого байта
r8 = аналогично предыдущему
r9 = 64(0x40) MB_ICONINFORMATION, значок информации

А далее идет вызов функции MessageBoxA, с которым не все так просто. Дело в том, что компиляторы стараются использовать как можно более короткие команды. Чем меньше размер команды, тем больше таких команд влезет в кэш процессора, соответственно, будет меньше промахов кэша, подзагрузок и выше скорость работы программы. Для более подробной информации по командам и внутренней работе процессора можно обратиться к документации Intel 64 and IA-32 Architectures Software Developer’s Manuals.

Мы могли бы вызвать функцию по полному адресу, но это заняло бы как минимум (1 опкод + 8 адрес = 9 байт), а с относительным адресом команда call занимает всего 6 байт.

Давайте взглянем на эту магию поближе: rip + 0x203E, это ни что иное, как вызов функции по адресу, указанному нашим смещением.

Я подсмотрел немного вперед и узнал адреса нужных нам смещений. Для MessageBoxA это 0x3068, а для ExitProcess это 0x3098.

Пора превратить магию в науку. Каждый раз, когда опкод попадает в процессор, он высчитывает его длину и прибавляет к текущему адресу инструкции (RIP). Поэтому, когда мы используем RIP внутри инструкции, этот адрес указывает на конец текущей инструкции / начало следующей.
Для первого call смещение будет указывать на конец команды call это 002A не забываем что в памяти этот адрес будет по смещению Sections[".text"].VirtualAddress, т.е. 0x1000. Следовательно, RIP для нашего call будет равен 102A. Нужный нам адрес для MessageBoxA находится по адресу 0x3068. Считаем 0x3068 — 0x102A = 0x203E. Для второго адреса все аналогично 0x1000 + 0x0037 = 0x1037, 0x3098 — 0x1037 = 0x2061.

Именно эти смещения мы и видели в командах ассемблера.

0024 call QWORD PTR [rip + 0x203E] 002A mov rcx, 0x0 0031 call QWORD PTR [rip + 0x2061] 0037 add rsp, 0x20 

Запишем в наш файл секцию .text, дополнив нулями до адреса 0x400: (5) RAW .text section (Offset 0x00000200-0x00000400)
55 48 89 E5 48 83 EC 20 48 C7 C1 00 00 00 00 48 C7 C2 00 20 40 00 49 C7 C0 0D 20 40 00 49 C7 C1 40 00 00 00 FF 15 3E 20 00 00 48 C7 C1 00 00 00 00 FF 15 61 20 00 00 48 83 C4 20 5D C3 00 00 00 ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Хочется отметить что всего лишь 4 строки реального кода содержат весь наш код на ассемблере. А все остальное нули что бы набрать FileAlignment. Последней строкой заполненной нулями будет 0x000003F0, после идет 0x00000400, но это будет уже следующий блок. Итого в файле уже 1024 байта, наша программа весит уже целый Килобайт! Осталось совсем немного и ее можно будет запустить.


Секция .rdata


Это, пожалуй, самая простая секция. Мы просто положим сюда две строки добив нулями до 512 байт. .rdata
0400 "Hello World!\0" 040D "MyApp\0" 


(6) RAW .rdata section (Offset 0x00000400-0x00000600)
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 4D 79 41 70 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 


Секция .idata


Ну вот осталась последняя секция, которая описывает импортируемые функции из библиотек.

Первое что нас ждет новая структура IMAGE_IMPORT_DESCRIPTOR

Структура IMAGE_IMPORT_DESCRIPTOR
Struct IMAGE_IMPORT_DESCRIPTOR { u32 OriginalFirstThunk (INT) u32 TimeDateStamp u32 ForwarderChain u32 Name u32 FirstThunk (IAT) } 


Описание IMAGE_IMPORT_DESCRIPTOR

OriginalFirstThunk — Адрес указывает на список имен импортируемых функций, он же Import Name Table (INT)
Name — Адрес, указывающий на название библиотеки
FirstThunk — Адрес указывает на список адресов импортируемых функций, он же Import Address Table (IAT)


Для начала нам нужно добавить 2 импортируемых библиотеки. Напомним:
func MessageBoxA(u32 handle, PChar text, PChar caption, u32 type) i32 ['user32.dll'] func ExitProcess(u32 code) ['kernel32.dll'] 

(7) RAW IMAGE_IMPORT_DESCRIPTOR (Offset 0x00000600)
58 30 00 00 00 00 00 00 00 00 00 00 3C 30 00 00 68 30 00 00 88 30 00 00 00 00 00 00 00 00 00 00 48 30 00 00 98 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 


У нас используется 2 библиотеки, а что бы сказать что мы закончили их перечислять. Последняя структура заполняется нулями.
 INT | Time | Forward | Name | IAT --------+--------+----------+--------+-------- 0x3058 | 0x0 | 0x0 | 0x303C | 0x3068 0x3088 | 0x0 | 0x0 | 0x3048 | 0x3098 0x0000 | 0x0 | 0x0 | 0x0000 | 0x0000 

Теперь добавим имена самих библиотек: Имена библиотек
063С "user32.dll\0" 0648 "kernel32.dll\0" 


(8) RAW имена библиотек (Offset 0x0000063С)
 75 73 65 72 33 32 2E 64 6C 6C 00 00 6B 65 72 6E 65 6C 33 32 2E 64 6C 6C 00 00 00 00 


Далее опишем библиотеку user32: (9) RAW user32.dll (Offset 0x00000658)
 78 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4D 65 73 73 61 67 65 42 6F 78 41 00 00 00 


Поле Name первой библиотеки указывает на 0x303C если мы посмотрим чуть выше, то увидим что по адресу 0x063C находится библиотека «user32.dll\0».

Подсказка, вспомните что секция .idata соответствует смещению в файле 0x0600, а в памяти 0x3000. Для первой библиотеки INT равен 3058, значит в файле это будет смещение 0x0658. По этому адресу видим запись 0x3078 и вторую нулевую. Означающую конец списка. 3078 ссылается на 0x0678 это RAW-строка

«00 00 4D 65 73 73 61 67 65 42 6F 78 41 00 00 00»

Первые 2 байта нас не интересуют и равны нулю. А вот дальше идет строка с названием функции, заканчивающаяся нулем. То есть мы можем представить её как "\0\0MessageBoxA\0".

При этом IAT ссылается на аналогичную таблице IAT структуру, но только в нее при запуске программы будут загружены адреса функций. Например, для первой записи 0x3068 в памяти будет значение отличное от значения 0x0668 в файле. Там будет адрес функции MessageBoxA загруженный системой к которому мы и будем обращаться через вызов call в коде программы.

И последний кусочек пазла, библиотека kernel32. И не забываем добить нулями до SectionAlignment.

(10) RAW kernel32.dll (Offset 0x00000688-0x00000800)
 A8 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A8 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 45 78 69 74 50 72 6F 63 65 73 73 00 00 00 00 00 00 00 00 00 00 00 ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 



Проверяем что Far смог корректно определить какие функции мы импортировали:

Отлично! Все нормально определилось, значит теперь наш файл готов к запуску.
Барабанная дробь…

Финал


Поздравляю, мы справились!

Файл занимает 2 Кб = Заголовки 512 байт + 3 секции по 512 байт.

Число 512(0x200) ни что иное, как FileAlignment, который мы указали в заголовке нашей программы.

Дополнительно:
Если хочется вникнуть чуть глубже, можно заменить надпись «Hello World!» на что-нибудь другое, только не забудьте изменить адрес строки в коде программы (секция .text). Адрес в памяти 0x00402000, но в файле будет обратный порядок байт 00 20 40 00.

Или квест чуть сложнее. Добавить в код вызов ещё одного MessageBox. Для этого придется скопировать предыдущий вызов, и пересчитать в нем относительный адрес (0x3068 — RIP).

Заключение


Статья получилась достаточно скомканной, ей бы, конечно, состоять из 3 отдельных частей: Заголовки, Программа, Таблица импорта.

Если кто-то собрал свой exe значит мой труд был не напрасен.

Думаю в скором времени создать ELF файл похожим образом, интересна ли будет такая статья?)

Ссылки:

Как сделать файл exe | Компьютерные ЛЮДИ



В недавнем времени я столкнулся с одной проблемой. Нам задали курсовой проект, я все сделал отлично, но осталось сделать только установочный файл, а именно файл .exe.

Нам преподаватели дали уж очень неразборчивую программку, но один умный человек посоветовал другую, которая называется Smart Movie Maker. Он сказал, что легче программы для этой задачи еще не видел.

И действительно это так!!! Я сделал установочный файл буквально за минуты 2.

Сегодня я хочу поделиться своими знаниями и расскажу как же именно сделать установочный файл .exe.

Для начала скачайте программу Smart Install Maker и запустите ее.

У вас появится такое окошко:

Как вы можете увидеть левая часть окна разбита на две части: Инсталлятор и Деинсталлятор.

Как вы уже поняли в части которая называется Инсталлятор будут настройки именно для вашего установочного файла и в части Деинсталлятор соответственно настройки для файла, который буде удалять вашу программу.




Что я вам расскажу о основных характеристиках для установочного файла.
Как вы уже заметили у файла .exe довольно таки много параметров. Поговорим немного о каждом.

Информация:
Вы могли его сразу увидеть, когда запустили программу. Я думаю там и так все понятно, что нужно ввести Имя программы, Версия и т.д. Я буду говорить только об основных из них.

Тут есть пункт Сохранить как. Обязательно укажите в нем путь куда именно будет сохранен ваш установочный файл.

Все заголовки и надписи тоже заполните, ведь это все будете видеть при установке программы.

Тип сжатия можете выбрать Максимальное, ведь так у вас уменьшится размер вашего установочного файла. А также Тип разбивки можете выбрать одним файлом, так будет проще для пользователя.

Файлы:
На скриншоте я также отметил плюсик. Нажав на него вы должны выбрать файлы, которые будут распаковыватся при установке программы, выберите только основные файлы программы, не нужно ничего лишнего туда пихать.

Требования:

В этом пункте нужно указать требования к вашей программе. Например тип ОС или дополнительное ПО, которое должно быть установлено на компьютер.

Диалоги:

На этом окне есть четыре вкладки: Общая, Лицензия/Информация, Пароль и Завершение. Диалоги это дополнительные окна или пункты, которые будут появляться. Например, окно о лицензионном соглашении.

Интерфейс:

Тут вы сможете оформить свое установочное окно. Выбрать верхнюю часть меню или центральную, поменять значок программы и все что связано с графическим интерфейсом программы.




В принципе это все основные пункты, которые потребуются для установочного файла.

А теперь на завершение, чтобы наконец то создать сам файл, просто нажмите кнопку Компилировать.

Как вы видите интерфейс программы очень простой и понятный. Так что пользуйтесь, надеюсь она вам поможет, так как помогла и мне.

Добавить комментарий

❶ Как создать exe-файл 🚩 Компьютеры и ПО 🚩 Другое

Видеоряд меняется не с заданной частотой – 25 кадров в минуту, а через временные интервалы, устанавливаемые пользователем в соответствии с динамикой изображения. Если изображение статично (стоит на месте), то оно не меняется, а в видеофайле изображение меняется со скоростью 25 кадров в секунду. При воспроизведении на экране монитора возможны помехи, которые пользователями воспринимаются как ухудшение качества.

Другой пример, при котором также лучше всего сделать exe файл – это фотопрезентация. Фотографии высокого качества в формате 2000x3000 пикселей по размеру занимают до 3,5 Мб. Создавая презентацию или слайд-шоу с использованием множества фотографий, размеры файла будут просто огромны. Кроме того, выходные характеристики слайд-шоу должны соответствовать разрешению конкретного монитора. В такой ситуации лучше создать exe файл правильно, т.е. установить параметр «Размер рендеринга». Он активен по умолчанию со значением 800х600 пикселей. Его нужно увеличить до 1200х900 пикселей.

Просмотр на экране с разрешением, например, 1280x1024 пикселей, фотоматериала размерами 2000x3000 пикселей зачастую приводит к возрастанию нагрузки на процессор компьютера, что может вызывать дерганье картинки при смене и движении. Для уменьшения нагрузки и размера файла лучшим решением будет подгонка вставляемого в слайд изображения таким образом, чтобы оно было такого же размера, но без сжатия. При подгонке фото, дополнительно нужно повысить резкость изображений в пределах 20-25%.

Для создания слайд-шоу в формате exe, можно использовать меню в программе презентаций. Выбираем функцию «Создать», переходим на «Создать exe шоу». На появившейся вкладке «Выходные опции» указываем «Качество вывода» - «Высокое». Далее устанавливаем или отказываемся от меню в создании слайд-шоу. В соседней вкладке «Выбор шоу» нужно снять метку «Включить вводное шоу на вкладке» и «Заставка при старте шоу». После этого активировать команду «Создать». Получившийся exe файл презентации или слайд-шоу можно записывать на CD или DVD. Для этого подходят любые программы записи компакт-дисков.

 

Как создать для программы тихий инсталлятор? или установка Mozilla Firefox без лишних вопросов

Здравствуйте, дорогие читатели.

сегодня по просьбам людей я решил рассказать, как из обычного установщика программы сделать тихий инстолятор.

что такое тихий инстолятор? это обычный инстолятор, но ему передаётся специальный параметр, чтобы он не задавал пользователю вопросов, связанных с установкой.
Тренироваться мы будем на Mozilla Firefox версии 27.0.1 и нашем компьютере, без которого будет бесполезен в корне этот труд! 🙂

что нам понадобится:

  1. руки и голова, это самое главное.
  2. Блокнот. это думаю у вас найдётся.
  3. сам инстолятор. это совсем не проблема.
  4. Архиватор 7-zip, но если у вас уже установлен WinRar, то и он подойдёт.
  5. Остальное выбирайте сами, кому пригодится больше справка по пакетным файлам, а кому и крепкий кофе с плиткой шоколада.

Предисловие

Простым языком: пакетный файл — это такой файл, в котором последовательно записаны команды для интерпритатора cmd.exe. эти команды выполняются последовательно т.к., в пакетном режиме. по этому и называются они пакетными файлами.
Для тихой установки мы будем использовать такой файл, ибо именно через него проще всего передать параметры инсталлятору, чтобы он поставил программу так, чтобы не дыма, ни огня, а программа была, появилась у нас в системе как чёрт из табакерки.

Для чего это нужно?
Всё просто: кому-то надо быстро поставить много программ, а кому-то тихо внедрить программу в систему :-), но это уже не тема данной статьи.

Я постараюсь описать всё как можно подробнее. чтобы понял даже новичок в этом деле и вопросов не возникла, но если будут, постараюсь на все ответить.

Приступаем к работе

Итак, для начала подготовимся.
Качаем 7-zip на компьютер и устанавливаем его.

Затем качаем русский дистрибутив Mozilla Firefox, однако устанавливать его пока не будем: пусть он подождёт и отдохнёт.

На этом дистрибутиве мы и будем проводить свои эксперименты в области тихой установки.

Вот и всё, подготовку объявляем завершённой, вперёд!

Создание тихого инстолятора

Так как дистрибутив Firefox является уже своего рода архивом, а главный инстолятор внутри, распаковываем его в отдельную папку с помощью 7-zip.
После распаковки в директории, куда распаковали дистрибутив, мы увидим две папки

и файл setup.exe
именно этот файл является установщиком программы, ему и будем передавать параметры.
В этой же папке давайте создадим текстовой файл, но его имя изменим на «install.bat», заметьте расширение тоже надо менять.
Создали? отлично! Теперь в контекстном меню выберем пункт «Изменить и пишем туда следующий текст:

@echo off
echo Please wait, program installing
start /wait setup.exe /s
exit

Закрываем и сохраняем изменения.

Теперь подробнее о том, что означают команды.

@echo off
Отключаем вывод команд на экран, зачем, ведь мы сами знаем, какие команды туда вписали.

start /wait setup.exe /s

Запускаем программу установки, да не просто, а передаём ей параметр «S», что значит тихую установку программы.
Он записан в конце «/s»
к тому же к команде «start» мы добавили параметр «/wait», чтобы выполнение дальнейших команд приостановилось до закрытия программы установки. Если окошко с уведомлением вам не нужно, то этот параметр убираем.

echo Please wait, program installing
Тут вовсе просто: выводим текст «Please wait, program installing» на экран.
Если параметр «wait» не используется, то выводить текст на экран большого смысла нет, так что эту строчку можно совсем исключить из файла.

exit

Просто закрываем сеанс работы с cmd.exe. он конечно и сам может, но чтобы уж точно закрылся лучше напишем.

Вот и всё! теперь запускаем созданный нами файл «install.bat» и проверяем работу.

Если что-то не так, то читаем статью с самого начала очень внимательно и повторяем всё снова, а если всё у вас получилось, то поздравляю! вы успешно научились устанавливать Firefox в тихом режиме и по аналогии сможете таким же образом установить многие программы, которые принимают параметр «S», как сигнал для тихой установки. И по правде говоря их достаточно много.
Что делать, если параметр «S» не работает, я расскажу уже в следующих статьях.

Всем желаю удачной тихой установки!

Читайте также

Типы инстоляторов и их ключи для тихой установки
Упаковка *.exe с помощью Win Rar
© Евгений Поплавский, 2014
Специально для TifloHelp.ru

Создание msi-пакетов и установка любого ПО средствами групповых политик Windows / Хабр

Доброго времени суток, Хабр! Хочу представить интересный, по моему мнению, способ создания msi-инсталляторов для любого программного обеспечения и, как следствие, развертывание его средствами GPO. Подчеркну, что описанный метод не подразумевает создание «слепков» системы, а использует нативные инсталляторы софта, при чем для создания msi применяются только бесплатные для коммерческого использования продукты.
Введение, пара ссылок и дисклеймер

Каждый нормальный инсталлятор ПО имеет возможность автоматической установки с определенными или заложенными по умолчанию параметрами. Суть моего метода проста и заключается в том, чтобы запаковать нативный инсталлятор в «контейнер» msi и запустить его с необходимыми параметрами командной строки. В сети куча информации по автоматической установке того или иного приложения, и я не буду заострять на этом внимание. Наша цель, повторюсь, — установка ПО средствами групповых политик. Кстати, некоторые из вас могут возразить, что установку можно производить через ZAW, но, к сожалению, данный метод применим только для установки с правами текущего пользователя и не может применяться для централизованной автоматической установки приложений.

Интересный цикл статей по установке ПО через ГП. Для новичков рекомендую прочитать все, чтобы потом не спрашивать, чем отличается тип установки «назначенный» от «публичный».

Необходимый софт. Exe to MSI Converter freeware и всем известная orca Первый нужен для того, чтобы создать msi из exe, а вторая — чтобы получившийся msi-ник смог установиться через групповые политики.

Метод не претендует на полную уникальность и в некоторых местах могут встречаться излишества, которых можно было бы избежать, но это связанно отсутствием желания и необходимости слишком глубоко вникать в параметры таблиц msi-пакетов. Первоначальной целью ставилось быстро найти бесплатный способ создания msi и после нескольких часов, проведенных в чтении зарубежных форумов и бесконечных перезагрузках виртуальной машины, метод был найден. Также, статья — это не обзор интерфейса программ, и скриншотов вы не увидите.

Создание и подготовка пакета

Пример установки будет произведен для Mozilla Firefox, т. к. это широко известный продукт, не имеющий msi-инсталлятора от разработчиков.
  1. Запускаем exe to msi и указываем в нем путь к exe-установщику firefox. По ранее найденной в сети информации становится понятно, что по-тихому установить огнелиса можно с параметрами -ms -ira. Их-то и указываем во втором поле exe to msi и жмем «Build MSI».
  2. Казалось бы все, msi-пакет готов. Действительно, запустив получившийся результат мы получим установленный в системе firefox и в статье можно было бы ставить точку. К сожалению, не все так просто. Текущий пакет установки не пригоден для развертывания через GPO и при загрузке компьютера вы будете получать совершенно ничего не объясняющие ошибки в логах «произошла неисправимая ошибка...» А все дело в том, что разработчики exe to msi тоже хотят есть и их бесплатный продукт генерирует msi «не по правилам».
  3. Ну что ж, берем орку и открываем в ней наш эмсиайник.
  4. Первым делом находим в левом списке таблицу Property и обращаем внимания на два поля — ProductCode и UpgradeCode. Эти два поля должны быть уникальны для каждого продукта, а наш exe to msi генерит всегда одинаковые. Ну что ж, не беда, жмем в верхнем меню View -> Summary Information, находим поле PackageCode и жмем New GUID. Получившийся результат копируем в буфер обмена и вставляем в ProductCode. Повторяем для UpgradeCode и наконец для самого PackageCode. Тут же в Summary Information правим поле Title на Mozilla Firefox, остальное по желанию. Это, по сути, ни на что не влияет.
  5. Опять же в таблице Property меням ProductName на Mozilla Firefox (я до кучи меняю еще ARPCONTACT и Manufacturer). Можно так же поставить правильное значение для ProductVersion.
  6. Вроде бы GUID и прочие «IDы» поменяли, но как показывает практика, этого недостаточно. Жмите в orca Tools –> Validate, снимите птицу Show INFO Messages и нажимайте Go.
  7. Как видите, вылезла куча ошибок на наличие/отсутствие некоторых таблиц и значений. Я не стал заморачиваться и просто взял первый попавшийся (7zip x64 9.20) небольшой msi и скопировал оттуда 4 недостающие таблицы (через Export-Import, естественно): _Validation, AdminExecuteSequence, AdminUISequence и AdvtExecuteSequence. На самом деле, я уверен, что можно создать «правильный» msi-инсталлятор, без лишнего мусора, но не забывайте, наша цель всего лишь запустить родной setup приложения в тихую.
  8. После добавления таблиц проходим снова Tools –> Validate (к слову, первый раз проверку можно вообще не делать и сразу импортировать таблицы). Если вы тоже взяли за основу msi от 7zip, то результатом будет шесть эрроров, которые необходимо устранить. Жмите Close, удаляйте лишние поля, отмеченные красным.
  9. В конце можно еще раз проверить валидацию и убедиться что остались лишь ничем не мешающие варнинги. Сохраняем msi.
  10. Вот в принципе и все, осталось добавить msi в ГП и назначить необходимые свойства.

Нюансы

  1. При установке описанным выше методом у вас появятся как бы две копии софта. Первая — собственно нужное приложение, а вторая — исходный msi-ник, ведь мы же его как бы поставили. В принципе, это ни на что не влияет, кроме как на отображение в «Установка и удаление программ», и то, только в Windows XP (если вы ничего не меняли, кроме указанного мной). Минусом может быть появление лишних программ при автоматической инвентаризации софта, если вы ее используете.
  2. Автоматически удалить приложение теми же средствами развертывания не получится. Точнее получится, но удалится только и так не нужный msi-контейнер. Ну можно повозиться со свойствами msi при его создании, чтобы оно захватывало с собой установленное ранее приложение, так же втихую. Я такой задачи не ставил.
  3. При установке обновлений ПО нужно указывать в свойствах ГП приложения, чтобы оно заменяло предыдущее, т.е обязательно предварительно удаляло старое. Это гарантирует, что у вас не будут плодиться те самые никому не сдавшиеся левые дубли приложений в «установке и удалении программ».
  4. Чтобы установить приложение, имеющее дистрибутив из нескольких файлов, вам придется сначала упаковать его в exe, который при запуске сам распакуется и даст команду для тихой установки. Рекомендую создавать sfx-архивы средствами того же 7-zip.
  5. Ничего не мешает ставить ПО через скрипты автозагрузки. Более того, такой метод более гибкий, и я давно его использую через свои скрипты. Вот только использование родных средств ГП получается намного быстрее, т. к. простое создание msi из exe занимает пару минут.
  6. Windows 7 почему-то не пишет «Установка управляемого приложения...», а просто говорит «пожалуйста, подождите». При первом развертывании всей кучи софта разом или при установке тяжелого приложения это может сподвигнуть юзера на звонок админу или нажатие кнопки резет.

На этом вроде бы все, надеюсь было интересно, делитесь опытом.

Как создать установочный файл EXE

Что вы делаете, когда создали новое программное обеспечение Windows и хотите поделиться им со всем миром? В идеале вы должны создать установочный пакет EXE.Вот как.

create-exe-file-featured

Что вы делаете, когда создаете новое программное обеспечение для Windows - от простого диагностического инструмента до сложной компьютерной видеоигры - и хотите поделиться им со всем миром? Что ж, вы можете сжать файлы в один ZIP-файл и распространить его.

windows-diagnostics

Или вы можете пофантазировать и вместо этого создать установщик EXE.

В этом посте мы рассмотрим три различных метода: самораспаковывающийся пакет, простой установщик с использованием встроенного IExpress и расширенный установщик с использованием настраиваемой Inno Setup.

Быстрый метод: использование 7-Zip

Вы, вероятно, уже используете 7-Zip для извлечения всех видов архивных файлов, и вы, вероятно, уже знаете, что 7-Zip может создавать архивные файлы, но знаете ли вы, что вы также можете использовать его для создания EXE-файла, который действует как установщик?

Он называется SFX-архивом («самораспаковывающийся») и работает путем сжатия всех ваших конечных файлов вместе, а затем встраивания специального EXE-файла в архив, который знает, как все распаковать.Другими словами, получатель может извлечь SFX-архив (который выглядит как EXE-файл), даже если у него нет подходящего программного обеспечения, что может случиться с такими форматами, как 7Z, RAR, TAR и ZIP.

Как создать свой собственный SFX-архив с помощью 7-Zip:

  1. Подготовьте все свои файлы и каталоги в одном основном каталоге и назовите каталог как хотите.
  2. Щелкните каталог правой кнопкой мыши и выберите 7-Zip> Добавить в архив ...
  3. В разделе Options включите Create SFX Archive и выберите следующие параметры ... > Формат архива: 7z> Уровень сжатия: Нормальный> Метод сжатия: LZMA2> Размер словаря: 16 МБ> Размер слова: 32> Размер сплошного блока: 2 ГБ
  4. Щелкните ОК .Готово!

Обратите внимание, что SFX-архивы не являются настоящими файлами установщика. Они не помещают извлеченные файлы в назначенный целевой каталог. Они не изменяют реестр Windows. Они не создают журналы установки и не отображаются как «установленное программное обеспечение» в приложении «Удалить». Это буквально архивные файлы, оформленные как EXE-файлы.

Скачать - 7-Zip (бесплатно)

Простой метод: использование IExpress

IExpress - это утилита, которая поставляется в комплекте с версиями Windows, начиная с Windows XP и выше.Утилита имеет внешний графический интерфейс (называемый IExpress Wizard), но вы также можете создавать файлы установщика, используя файлы директивы самоизвлечения (SED), написанные вручную. Мы рекомендуем Мастера.

Как и 7-Zip выше, этот метод создает самораспаковывающийся архив, но с двумя основными отличиями: во-первых, конечный пользователь будет проходить через многостраничный мастер установки, а во-вторых, конечный пользователь может указать целевой каталог, в котором находится инструмент. распакует файлы.

Как создать свой установщик EXE с помощью IExpress:

  1. Откройте командную строку «Выполнить» (клавиша Windows + R ) и введите iexpress.exe для запуска мастера IExpress.
  2. Выберите Создать новый файл директивы самоизвлечения и нажмите Далее .
  3. Выберите Извлечь только файлы и нажмите Далее .
  4. В качестве заголовка пакета можно использовать имя вашего приложения.
  5. Для запроса подтверждения выберите Нет запроса или Запрашивать пользователя с .В любом случае это не имеет значения. Для конечного пользователя включение одного - всегда безопасный выбор.
  6. Для лицензионного соглашения: . Отображение лицензии , если вы хотите, чтобы конечный пользователь согласился с каким-либо лицензионным соглашением с конечным пользователем (EULA). В противном случае можно выбрать Не отображать лицензию .
  7. Добавьте все файлы, которые вы хотите видеть установленными, щелкнув Добавить , перейдя туда, где находятся файлы, и выбрав их все.
  8. Продолжите работу с мастером IExpress и выберите желаемые параметры для запросов Показать окно и Finished Message .
  9. В качестве имени пакета щелкните Обзор , перейдите туда, где вы хотите создать установщик EXE, и дайте ему имя. Это EXE-файл, который вы собираетесь распространить среди конечных пользователей. Щелкните Далее .
  10. Наконец, выберите Сохранить файл директивы самоизвлечения (SED) , если вы хотите создать измененный установщик позже, например, когда вы исправили программное обеспечение и вам потребуется обновленный установщик. Если вы выберете Не сохранять , вам придется выполнить весь процесс с нуля.
  11. На странице Create Package нажмите Next .Подождите. Готово!

Обратите внимание, что у IExpress есть некоторые особенности и проблемы. Не позволяет включать пустые каталоги. Если в вашей установке есть подкаталоги, подкаталоги не будут включены. Если у вас есть несколько файлов с одинаковым именем, даже в разных каталогах, создание установщика не удастся.

Из-за этих странностей мы рекомендуем вместо этого использовать метод ниже.

Рекомендуемый метод: использование Inno Setup

Inno Setup - это утилита с открытым исходным кодом, которая активно разрабатывается с 1997 года.Он был создан частично в ответ на то, что в то время было второстепенным InstallShield Express. С тех пор он стал предпочтительным создателем установщика для тех, кто не хочет изучать проприетарные варианты.

Его самое большое преимущество - его гибкость.Inno Setup использует файлы сценариев с расширением ISS («Inno Setup Script») для настройки различных аспектов программы установки: какие файлы включены, где происходит установка, нужно ли создавать ярлыки и т. Д. Файлы ISS используют форматирование, аналогичное файлам INI. и может быть создан с помощью мастера установки Inno.

Как создать свой собственный установщик с помощью Inno Setup:

  1. Запустите приложение Inno Setup Compiler.
  2. В приглашении выберите . Создайте новый файл сценария с помощью мастера сценариев .
  3. Введите название вашего приложения и версию приложения. При желании вы также можете указать сведения об издателе приложения и веб-сайте приложения. Щелкните Далее .
  4. Выберите Целевую базовую папку , которая по умолчанию - Program Files.Введите имя папки Application , которая является именем основного каталога, в который будут помещаться ваши установочные файлы. Щелкните Далее .
  5. Для основного исполняемого файла приложения найдите и выберите основной EXE-файл, который запустит ваше приложение. Если вы не устанавливаете приложение, включите . У приложения нет основного исполняемого файла . Затем добавьте файлы и папки в вашу установку с помощью Add files... и Добавить папки ... кнопки. Щелкните Далее .
  6. На странице «Ярлыки приложений» оставьте значения по умолчанию или измените их в соответствии со своими предпочтениями. Все они говорят сами за себя. Щелкните Далее .
  7. На странице документации приложения вы можете указать до трех файлов TXT, которые будут отображаться в процессе установки конечного пользователя.Обычно это LICENSE.TXT, INSTALL.TXT и README.TXT, но они могут быть какими угодно. Щелкните Далее .
  8. На странице «Настройка языков» оставьте English , но вы можете свободно добавлять любое количество других языков. Щелкните Далее .
  9. На странице «Параметры компилятора» вы можете настроить EXE-файл установщика: > Пользовательская выходная папка компилятора - это место, где будет помещен полученный EXE-файл установщика.> Имя базового файла вывода компилятора - это то, что будет называться EXE-файлом. Значение по умолчанию - setup.exe . > Файл значка выборочной установки - это значок, который будет использоваться для EXE-файла установщика. Это должен быть файл ICO, который вы можете скачать или преобразовать из PNG.
  10. Пароль программы установки защитит неавторизованных пользователей от использования программы установки. Оставьте поле пустым, чтобы отключить эту функцию.
  11. Щелкните Finish . Когда будет предложено скомпилировать новый сценарий, нажмите Да . Когда будет предложено сохранить сценарий, выберите Нет , если это одноразовый файл установщика, или выберите Да , если вы планируете изменить или обновить его позже. Готово!

Скачать - Inno Setup (бесплатно)

Какой метод подходит вам?

Если ваше программное обеспечение чрезвычайно простое или вы собираетесь распространять его только среди ограниченного числа людей, используйте метод 7-Zip.Это просто, быстро и практически не требует технических знаний.

Если ваше программное обеспечение несколько простое и вы хотите предоставить конечным пользователям настоящий мастер установки, воспользуйтесь методом IExpress.

Если ваше программное обеспечение сложное и у вас за плечами большой технический опыт, воспользуйтесь методом Inno Setup.Он самый гибкий, самый мощный и не страдает от проблем, присущих IExpress.

Какой метод вы будете использовать? Есть ли другие методы, которые мы упустили? Дайте нам знать в комментариях ниже!

Изображение предоставлено: sdecoret, DaGa5 через Shutterstock.com

woman with phone Предметы домашнего обихода, о которых вы не знали, что можете контролировать их с помощью смартфона

Технологии нашли применение в повседневных предметах интерьера вашего дома.И нас ждут сюрпризы, о которых вы, возможно, даже не подумаете.

Об авторе Джоэл Ли (Опубликовано 1598 статей)

Джоэл Ли - главный редактор MakeUseOf с 2018 года.У него есть B.S. Кандидат компьютерных наук и более девяти лет профессионального опыта написания и редактирования.

Больше От Джоэла Ли
Подпишитесь на нашу рассылку новостей

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Еще один шаг…!

Подтвердите свой адрес электронной почты в только что отправленном вам электронном письме.

.

Как создать рабочий исполняемый файл (.exe) из кода C

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Стеклянная печь
.

Создайте пакет MSIX из любого установщика рабочего стола - MSIX

  • Читать 12 минут

В этой статье

Средство упаковки MSIX можно использовать для создания пакета приложения MSIX с помощью любого из следующих вариантов:

  • MSI
  • EXE
  • ClickOnce
  • App-V
  • Скрипт
  • Ручная установка

В этом документе вы узнаете, как взять любые существующие активы и преобразовать их в MSIX.

Перед тем, как начать преобразование, мы рекомендуем убедиться, что вы понимаете свой установщик и то, будет ли он преобразовывать.

Мы также рекомендуем следовать рекомендациям по настройке вашей среды и MSIX Packaging Tool для преобразования.

Примечание

В настоящее время средство упаковки MSIX поддерживает App-V 5.1. Если у вас есть пакет с App-V 4.x, мы рекомендуем использовать исходный установщик для преобразования в MSIX.

При первом запуске инструмента вам будет предложено дать согласие на отправку данных телеметрии.Важно отметить, что диагностические данные, которыми вы делитесь, поступают только из приложения и никогда не используются для вашей идентификации или связи с вами.

Создание пакета приложения - наиболее часто используемый вариант. Здесь вы создадите пакет MSIX из установщика или путем ручной установки полезной нагрузки приложения.

Способ упаковки

Выберите вариант вашей конверсионной машины:

  • Если вы уже работаете в чистой среде, выберите Создать пакет на этом компьютере

  • Если вы хотите подключиться к существующей виртуальной или удаленной машине, выберите Создать пакет на удаленной машине

  • Если у вас есть локальная виртуальная машина на вашей машине, которую вы хотите преобразовать, выберите Создать пакет на локальной виртуальной машине

    • Обратите внимание, что мы поддерживаем только виртуальные машины Hyper-V. Если вы хотите использовать другой продукт виртуализации, вы можете подключиться с помощью опции удаленной машины.
  • Нажмите Далее

Подготовить компьютер

Далее, на странице Подготовка компьютера представлены варианты подготовки компьютера к упаковке.

Требуется драйвер средства упаковки MSIX , и средство автоматически попытается включить его, если оно не включено. Инструмент сначала проверит с помощью DISM, установлен ли драйвер. Если у вас возникла проблема, попробуйте проверить нашу документацию по устранению неполадок, а затем заполнить проблему в Центре отзывов, если проблема не исчезнет.

Примечание

Драйвер средства упаковки MSIX отслеживает систему, чтобы фиксировать изменения, которые установщик вносит в систему, что позволяет средству упаковки MSIX создать пакет на основе этих изменений.

Центр обновления Windows активен Мы временно отключим Центр обновления Windows на время упаковки, чтобы не собирать посторонние данные.

  • Флажок Pending reboot по умолчанию отключен. Вам нужно будет вручную перезагрузить компьютер, а затем снова запустить инструмент, если вам будет предложено перезагрузить ожидающие операции.Это не обязательно, только рекомендуется.

  • [Необязательно] Установите флажок для Windows Search is Active и выберите Disable selected , если вы решили отключить службу поиска.

    • Не требуется, только рекомендуется.
    • После отключения инструмент обновит поле статуса до Отключено .
  • [Необязательно] Установите флажок SMS Host is Active и выберите Disable selected , если вы решили отключить службу хоста.

    • Не требуется, только рекомендуется.
    • После отключения инструмент обновит поле статуса до Отключено .

Когда вы закончите подготовку машины, нажмите Далее .

Выберите программу установки, которую хотите упаковать.

Первое, что вам нужно сделать, это понять, что произойдет с программой установки, которую вы хотите преобразовать. С любым из этих установщиков вы можете указать их здесь, чтобы упростить рабочий процесс, или вы можете вручную запустить его во время установки позже в рабочем процессе.

Установщики MSI

Если вы конвертируете установщик .msi, вы можете просто найти его и указать .msi. Если у вас есть сопроводительный файл .mst или .msp, вы можете указать его в поле аргументов установщика. Одно из преимуществ указания здесь вашего .msi-файла заключается в том, что мы можем извлечь из него всю информацию о пакете, что сэкономит ваше время на следующем этапе преобразования.

Установщики App-V

Если вы конвертируете с помощью App-V, это действительно простой процесс для вас.Все, что вам нужно сделать, это указать файл App-V, и вы быстро сможете создать страницу MSIX. Это связано с тем, что манифест пакета просто нужно перевести в пакет MSIX, и тогда он будет работать как MSIX. Предостережение заключается в том, что инструмент поддерживает только App-V 5.1 - если у вас App-V версии 4.x, мы рекомендуем вам взять исходный установщик, а затем преобразовать его непосредственно в MSIX.

EXE установщики

Если вы конвертируете установщик .exe, вы можете указать установщик на этом этапе.Из-за отсутствия согласованности формата с exe-файлом вам нужно будет вручную ввести информацию о пакете для вашего установщика.

Установщики ClickOnce

Если вы конвертируете установщик ClickOnce, вы можете указать установщик на этом этапе. Как и в случае с .exe, вам нужно будет вручную ввести информацию о пакете для вашего установщика.

Скрипты

Если вы используете сценарий для установки приложения, вы можете указать здесь командную строку. Кроме того, вы можете оставить это поле пустым и запустить сценарий вручную на этапе установки.

Ручная установка

Если вы хотите запустить программу установки вручную или выполнить действия программы установки вручную, вы можете оставить поле установщика пустым и на этапе установки выполнить действия, необходимые для вашей программы установки.

Если вы пытаетесь создать файл шаблона преобразования, вы не сможете сделать это без указания установщика.

Если у вас есть аргументы установщика, вы можете ввести требуемый аргумент в соответствующем поле.Это поле принимает любую строку.

Предпочтение при подписании

В разделе Предпочтение подписи выберите параметр подписи. Вы также можете установить это по умолчанию в своих настройках, что сэкономит вам несколько шагов при каждом преобразовании.

  • Войти с помощью подписи Device Guard Этот параметр позволяет вам войти в свою учетную запись Microsoft Active Directory, которую вы настроили для использования с подписью Device Guard, которая представляет собой службу подписи, которую Microsoft предоставляет, когда вам не нужно предоставлять свой собственный сертификат.Узнайте больше о том, как настроить учетную запись и о подписании Device Guard здесь.
  • Подпись с помощью сертификата (.pfx) Найдите и выберите файл сертификата .pfx. Если сертификат защищен паролем, введите пароль в поле пароля.
  • Укажите файл .cer (не подписывает) Этот параметр позволяет указать файл .cer. Это полезно, если вы не хотите подписывать пакет, но хотите убедиться, что информация об издателе соответствует теме сертификата, который будет использоваться для подписи.
  • Не подписывать пакет Выберите этот вариант, если вы будете подписывать свой пакет позже. ПРИМЕЧАНИЕ. Вы не можете установить пакет MSIX, если он не подписан
  • .
  • При подписании мы настоятельно рекомендуем добавить метку времени к вашему сертификату, чтобы срок действия вашего сертификата продлился дольше срока его действия. Допустимый формат - URL-адрес сервера меток времени RFC 3161.

Примечание

Подписание приложения формата пакета MSIX сертификатом SHA1 не поддерживается.

Нажмите Далее , чтобы продолжить.

Информация о пакете

После того, как вы решите упаковать приложение на существующей виртуальной машине, вы должны предоставить информацию о приложении. Инструмент попытается автоматически заполнить эти поля на основе информации, доступной от установщика. У вас всегда будет возможность обновить записи по мере необходимости. Если поле обозначено звездочкой *, оно обязательно. Встроенная справка предоставляется, если запись недействительна.

  • Название пакета:
    • Обязательно и соответствует имени идентификатора пакета в манифесте для описания содержимого пакета.
    • Не отображается для конечного пользователя.
    • Учитывает регистр и не может содержать пробелов.
    • Может принимать строку длиной от 3 до 50 символов, состоящую из буквенно-цифровых символов, точек и тире.
    • Не может заканчиваться точкой и быть одним из следующих: «CON», «PRN», «AUX», «NUL», «COM1», «COM2», «COM3», «COM4», «COM5», «COM6». »,« COM7 »,« COM8 »,« COM9 »,« LPT1 »,« LPT2 »,« LPT3 »,« LPT4 »,« LPT5 »,« LPT6 »,« LPT7 »,« LPT8 »и« LPT9. "
  • Отображаемое имя пакета:
    • Требуется и соответствует пакету в манифесте для отображения понятного имени пакета пользователю в меню «Пуск» и на страницах настроек.
    • Поле принимает строку длиной от 1 до 256 символов, которую можно локализовать.
  • Имя издателя:
    • Обязательный и соответствует пакету, который описывает информацию об издателе.
    • Атрибут издателя должен соответствовать информации о субъекте издателя сертификата, используемого для подписи пакета.
    • Это поле принимает строку длиной от 1 до 8192 символов, которая соответствует регулярному выражению отличительного имени: "(CN | L | O | OU | E | C | S | STREET | T | G | I | SN | DC | СЕРИЙНЫЙ НОМЕР | Описание | PostalCode | POBox | Phone | X21Address | dnQualifier | (OID., + = "<> #;]) + |". "))) *".
  • Отображаемое имя издателя:
    • Требуется и соответствует пакету в манифесте для отображения понятного имени издателя пользователю в установщике приложения и на страницах настроек.
    • Поле принимает строку длиной от 1 до 256 символов, которую можно локализовать.
  • Версия:
    • Требуется и соответствует пакету в манифесте для описания номера версии пакета.
    • Это поле принимает строку версии в четверной нотации: «Major.Minor.Build.Revision ».
  • Описание:
  • Место установки:
    • Это место, куда установщик будет копировать полезные данные приложения (обычно это папка «Файлы программ»).
    • Это поле является необязательным, но рекомендуется, если полезная нагрузка приложения устанавливается вне папок Program Files.
    • Найдите и выберите путь к папке.
    • Убедитесь, что этот файл соответствует месту установки программы установки, пока вы выполняете операцию установки приложения.
  • Добавьте в этот пакет поддержку MSIX Core.
    • Если этот флажок установлен, появится раскрывающийся список, в котором вам будет предложено выбрать версию Windows для поддержки MSIX Core для создаваемого пакета.

Установка

  • Это этап установки, на котором инструмент отслеживает и фиксирует операции установки приложения.
  • Инструмент запустит установщик в среде, которая была указана ранее, и вам нужно будет пройти через мастер установки, чтобы установить приложение.
    • Убедитесь, что путь установки соответствует пути, указанному ранее на странице информации о пакете.
    • Возможно, вам потребуется создать ярлык на рабочем столе для недавно установленного приложения.
    • Закончив работу с мастером установки приложения, убедитесь, что вы завершили или закрыли мастер установки.
    • Если вам нужно запустить несколько установщиков, вы можете сделать это вручную на этом этапе.
    • Если приложению требуются другие предварительные условия, их необходимо установить сейчас.
    • Если приложению требуется .Net 3.5 / 20, добавьте дополнительную функцию в Windows.
  • Если вы ранее не указали программу установки, здесь вы можете вручную запустить программу установки или сценарий.
  • Если вашему установщику требуется перезапуск, вы можете выполнить перезапуск вручную или использовать кнопку «перезапуск» для перезапуска, и вы вернетесь к этому моменту в процессе преобразования после перезапуска.
  • По завершении установки приложения щелкните Далее .

Управление задачами первого запуска

На этой странице показаны исполняемые файлы приложения, захваченные инструментом. Мы рекомендуем запустить приложение хотя бы один раз, чтобы зафиксировать любые задачи первого запуска.

Вы можете запустить исполняемый файл, выбрав его, а затем щелкнув запустить . Вы также можете удалить ненужные точки входа, выбрав их, а затем щелкнув удалить .

Если имеется несколько приложений, установите флажок, соответствующий основной точке входа.Если вы не видите здесь .exe приложения, найдите и запустите его вручную. Затем обновите список .

Щелкните Далее Появится всплывающее окно с запросом подтверждения того, что вы закончили установку приложения и управление задачами первого запуска.

  • Если вы закончили, щелкните Да, переходите к .
  • Если вы не закончили, нажмите Нет, я еще не закончил . Вы вернетесь на последнюю страницу, где сможете запускать приложения, устанавливать или копировать другие файлы, а также библиотеки DLL / исполняемые файлы.

Отчет об услугах

Начиная с версии 1.2019.1220.0 MSIX Packaging Tool, вы можете преобразовать установщик со службами, поэтому мы добавили страницу отчета по службам. Если службы не были обнаружены, вы все равно будете видеть эту страницу, но она будет пустой с сообщением о том, что службы не обнаружены вверху страницы.

На странице отчета «Службы» перечислены службы, обнаруженные программой установки во время преобразования. Сервисы, которые содержат всю необходимую информацию и которые поддерживаются, будут показаны в таблице Включено .Сервисы, которым нужна дополнительная информация, нуждаются в исправлении или не поддерживаются, будут показаны в таблице Excluded .

Чтобы исправить службу или просмотреть дополнительные данные о службе, дважды щелкните запись службы в таблице, чтобы открыть всплывающее окно с дополнительной информацией о службе. При необходимости вы можете отредактировать часть этой информации.

  • Имя ключа: Название услуги. Это не редактируется.
  • Описание: Описание служебной записи.
  • Отображаемое имя: Отображаемое имя службы.
  • Путь к образу: Расположение исполняемого файла службы. Это не редактируется.
  • Начальная учетная запись: Начальная учетная запись для службы.
  • Тип запуска: Тип запуска службы. Поддерживает Automatic , Manual и Disabled .
  • Аргументы: Аргументы, запускаемые при запуске службы.
  • Зависимости: Зависимости для службы.

После того, как услуга была исправлена, вы можете переместить ее в таблицу Включено или оставить ее в таблице Исключено , если она вам не нужна в окончательном пакете. Для получения дополнительной информации ознакомьтесь с документацией по услугам.

Создать пакет

  • Укажите место для сохранения пакета MSIX.
  • По умолчанию пакеты сохраняются в локальной папке данных приложения.
  • Вы можете определить место сохранения по умолчанию в меню «Настройки».
  • Если вы создаете файл шаблона преобразования, вы также можете указать другое место сохранения для этого файла шаблона, если вы не хотите, чтобы он находился в том же месте, что и пакет MSIX.
  • Если вы хотите продолжить редактирование содержимого и свойств пакета перед сохранением пакета MSIX, вы можете выбрать «Редактор пакетов» и перейти в редактор пакетов.
  • Щелкните Create , чтобы создать пакет MSIX.

При создании пакета появится всплывающее окно.В этом всплывающем окне будет указано место сохранения, связанное с расположением файла вновь созданного пакета. Он также включает ссылку на расположение файлов журнала для MSIX Packaging Tool. Вы можете закрыть это всплывающее окно и перейти на страницу приветствия. Вы также можете выбрать редактор пакетов, чтобы просматривать и изменять содержимое и свойства пакета.

.Настольное приложение

- Как создавать файлы распространения (.exe) с помощью jruby

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
.

Смотрите также