Как я компилирую ресурсы в свое приложение и получаю к ним доступ? - PullRequest
4 голосов
/ 18 мая 2011

Как я могу сделать один executable пакет, содержащий DLL и файлы ресурсов изображений?

Тогда как мне извлечь их из моего исполняемого файла во время выполнения?

Ответы [ 2 ]

6 голосов
/ 18 мая 2011

Вариант 1 с использованием среды IDE (Delphi 2007 или более поздней версии):

Вы можете щелкнуть меню «Проект», затем выбрать «Ресурсы ...», в который можно загрузить любой файл.Для вашей цели это будет RC_DATA.

Вариант 2 без IDE

Если у вас нет вышеуказанной опции, вам нужно будет использовать BRCC32 (Borland Resource)Компилятор) для создания файла .RES из RC-файла, который вы затем связываете с приложением.Чтобы связать файлы ресурсов без использования IDE, попробуйте следующее:

Допустим, например, что мы хотим добавить пару файлов DLL, а имена файлов DLL - MyLib1.dll и MyLib2.dll, чтобыдобавьте этот открытый Блокнот и введите следующее:

MYLIB1 RCDATA ".. \ MyLib1.dll"

MYLIB2 RCDATA ".. \ MyLib2.dll"

Убедитесь, чтопути .. \ xxx.dll правильные, поэтому, очевидно, вам нужно отредактировать это.

Теперь вам нужно сохранить это как файл .rc, поэтому File> Save As .. (убедитесь, что выпадающий фильтрВсе файлы . ) и назовите его MyResources.rc.Теперь вам нужно использовать Resource Compiler для генерации Res-файла, используя эту консольную команду:

BRCC32 MyResources.RC

Вы можете написать эту команду с помощью командной строки, меню «Пуск»> «Выполнить»> cmd.exe, в качестве альтернативы вы можете найти BRCC32.exe в папке bin вашей установки Delphi и перетащить файл MyResource.RC в.

Это создаст файл Res с именем MyResources.RES, который вы можете включитьвнутри формы Main Delphi вашего Приложения, например:

{$R *.dfm}
{$R MyResources.res} 

, вы можете извлечь ресурсы, используя что-то вроде этого:

procedure ExtractResource(ResName: String; Filename: String);
var
  ResStream: TResourceStream;
begin
  ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    ResStream.Position:= 0;
    ResStream.SaveToFile(Filename);
  finally
    ResStream.Free;
  end;
end;
3 голосов
/ 18 мая 2011

Мне показалось удобным использовать контейнер .zip.

Тогда у вас будет две реализации:

  1. Добавьте некоторое содержимое .zip к существующему .exe, и код .exe получит содержимое .zip по запросу;

  2. Вставить содержимое .zip в качестве ресурса, а затем извлечь по запросу каждое содержимое.

Решение 1 добавит содержимое .zip после компиляции. Принимая во внимание, что 2 добавит .zip контент при компиляции. Для программы установки, я думаю, решение 1 имеет смысл для меня. Для способа получения некоторых необходимых файлов (библиотек и даже растровых изображений или текста), которые связаны с конкретным выпуском exe, может быть предусмотрено решение 2.

Использование .zip в качестве формата облегчает анализ содержимого и позволяет сжатие. Используя такой инструмент, как TotalCommander, вы можете даже прочитать содержимое файла .zip с помощью Ctrl + PgDown поверх .exe. Очень удобно.

В этой ссылке вы найдете о том, как реализовать решение 1, а в этой ссылке (на той же странице, но в другом посте), как использовать конструктор TZipRead.Create() для непосредственного использования. доступ к ZIP-архиву, связанному как ресурс. В нашем репозитории вы узнаете, как это работает с работающими приложениями: например, как мы встраивали в исполняемый файл SynProject значки, текстовое содержимое и библиотеки Graphviz + для проверки орфографии.

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

...