Подготовка файла res.res содержащего вложенные файлы
В данном примере я буду размещать внутри приложения Delphi 6 другой исполняемый EXE файл, который по нажатию кнопки из основного приложения будет сохранён в папку с изначально запускаемым файлов, а затем запущен. В примере в качестве вложенного файла я буду использовать файл с названием tubeNoob3.exe(это одна из моих предыдущих программ на Delphi 6).
С помощью блокнота создадим файл res.rc в котором напишем FILEEXE FILES tubeNoob3.exe
Теперь создадим файл bat.bat в котором с помощью блокнота напишем brcc32.exe res.rc
В папку с только что созданными двумя файлами скопируем файл который должен будет содержаться внутри основного приложения на Delphi 6, в моём случаи это tubeNoob3.exe теперь можно запустить файл bat.bat в результате в папке с тремя файлами должен появиться файл res.res который мы далее переместим в папку с проектом Delphi.
Чтобы не создавать указанные выше 2 файла вручную я заархивировал их, и Вы можете просто их исправить.
Если в результате запуска bat файла файл res.res не создался, возможно Вы не перезапустили компьютер после установки Delphi. В своей работе bat файл использует 2 других файла, а именно brcc32.exe и rw32core.dll оба они находятся по адресу C:\Program Files\Borland\Delphi6\Bin поэтому чтобы создать файл res.res без перезагрузки Windows скопируйте их в папку с bat файлом а затем попробуйте ещё раз запустить bat файл.
Разработка основной программы в которую вкладываем файлы
Если Вы собираетесь не только сохранять вложенные файлы при работе основной программы но и запускать их, то в uses необходимо добавить модуль ShellApi(для работы ShellApi.ShellExecute то есть для запуска извлечённого файла, если Вы не планируете запускать файл на выполнение, а просто планируете извлеч из res-файла, то подключать этот модуль не требуется).
Чтобы при компиляции Delphi видела файл res.res его необходимо разместить в папке с проектом а так же добавить в implementation строчку {$R res.res}.
Теперь создадим процедуру ExtractRes которая будет при обращении к ней сохранять вложенный в программу файл с папке с основной программой, я не буду показывать отдельный листинг процедуры так как в её теле всего 2 строчки, просто найдите её в общем листинге программы ниже в данной статье.
Теперь создадим событие при клике на кнопку в котором для начала выполним нашу только что созданную процедуру, а именно код ExtractRes('FILES', 'FILEEXE','tubeNoob3.exe'); а затем запустим вложенный файл программы на исполнение кодом ShellApi.ShellExecute(handle,'open',PAnsiChar('tubeNoob3.exe'),'','',sw_show);
Полный листинг получившейся основной программы
Функция для извлечения файла из Res с подтверждением успешности выполнения
Если Вы точно хотите быть уверены что файл был успешно извлечён и размещён в требуемой папке процедуру ExtractRes можно заменить кодом функции из следующего листинга, которая будет возвращать true в случаи успешного извлечения файла или false при ошибке, например если у Вас нет прав на запись в директорию.
В листинге ниже функция которая записывает информацию из файла находящегося в res в массив байт, который в фнкцию передаётся 3-им параметром.