Встраивание существующего exe-файла в другую программу

StackOverflow https://stackoverflow.com/questions/2496563

  •  21-09-2019
  •  | 
  •  

Вопрос

Есть ли способ связать существующий файл .exe с другими исходными файлами C++ во время компиляции?На самом деле я пытаюсь сжать и распаковать некоторые файлы в моей консольной программе с помощью LZMA(7zip) SDK, но, к сожалению, новичку очень сложно его использовать.

Существует версия LZMA для командной строки под названием 7za.exe, и мне интересно, могу ли я каким-то образом встроить ее в свою программу и использовать как функцию.Его можно легко использовать с функцией system() (которая кажется очень опасной), но если я отправлю свою программу кому-то, у кого нет 7za.exe в нужной папке, она не будет работать.

Я столкнулся с функцией CreateProcess() в заголовочных файлах windows.h, но, похоже, она обеспечивает то, что делает system(), более правильным и продвинутым способом.Я не знаю, может ли это на самом деле связь exe-файл как объектный файл во время компиляции

Это было полезно?

Решение

CreateProcess() — это вызов Windows API для запуска процесса, точно так, как он звучит, как дочернего элемента вашей программы, которым вы можете управлять, зная, что он HANDLE. system() выполняет системную команду.Это все, что вы когда-либо узнаете, и лично я избегаю его использования любой ценой - не в последнюю очередь потому, что он непереносим (функция существует в Windows и Linux, но команда - нет).

Можно добавить данные в конец EXE-образа — так работают установщики.Посмотри на это статья поддержки Microsoft, который, как ни странно, дает вам код на языке Basic, но вы сможете легко превратить его в C++.Вот статья о создание самораспаковщика что может быть более подходящим.Оба должны позволять вам встраивать файлы в exe.

Я не рекомендую вам извлекать 7za и позвони ему из System() или CreateProcess() - Рекомендую вам изучить SDK.Это сложно, но, делая это, вы многому научитесь.

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

Более подробно о адресация данных добавлен в exe.

Другие советы

Хорошо, попробуй это...

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

Это шаг связывания.Теперь доступ к исполняемому файлу во время выполнения — это совсем другое.По сути, алгоритм такой:

  1. Откройте EXE-файл для встраивания в двоичный редактор на уровне байтов (подойдет msdev.exe).Обратите внимание на первые 30 или 40 байтов как на уникальный маркер начала файла.
  2. Напишите функцию, которая открывает созданный выше составной файл и ищет встроенный файл по уникальному маркеру.
  3. Как только начало внедренного файла найдено, скопируйте байты этого файла во второй новый файл, используя файловый ввод-вывод.
  4. Запустите новый файл с помощью system() или аналогичного API.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top