Встраивание существующего exe-файла в другую программу
-
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.
Другие советы
Хорошо, попробуй это...
- Напишите утилиту командной строки, которая просто копирует один файл в конец другого.Вы можете сделать это с помощью файлового ввода-вывода Windows или команд оболочки.
- Сделайте шаг после сборки, который запустит эту утилиту.Ваша программа полностью свяжется обычным способом, а затем ваша утилита просто добавит байты второго exe-файла к целевому exe-файлу.
Это шаг связывания.Теперь доступ к исполняемому файлу во время выполнения — это совсем другое.По сути, алгоритм такой:
- Откройте EXE-файл для встраивания в двоичный редактор на уровне байтов (подойдет msdev.exe).Обратите внимание на первые 30 или 40 байтов как на уникальный маркер начала файла.
- Напишите функцию, которая открывает созданный выше составной файл и ищет встроенный файл по уникальному маркеру.
- Как только начало внедренного файла найдено, скопируйте байты этого файла во второй новый файл, используя файловый ввод-вывод.
- Запустите новый файл с помощью system() или аналогичного API.
Если вы таким образом распространяете чужую работу, пожалуйста, получите правильное лицензирование.Как правило, использование чужого двоичного файла в свой собственный является нарушением авторских прав — конечно, есть исключения.