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

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2010

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

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

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

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

Подробнее о данных адресации , добавленных в exe.

1 голос
/ 23 марта 2010

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

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

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

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

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

...