Многим начинающим программистам нередко приходится сталкиваться с такой проблемой, как нежелание созданного приложения работать на другом компьютере. Разработанное с таким трудом приложение выдает странные ошибки и требует какие-то библиотеки…
Для того, чтоб решить данную проблему достаточно немного поковыряться в настройках проекта.
В общем, открываем меню Project → Options (можно путем нажатия комбинации клавиш Shift+Ctrl+F11) и видим перед собой окошко настроек проекта под названием «Project Options for ProjectName.exe» (где ProjectName.exe название вашего проекта). Далее переходим на вкладку Packages. Здесь необходимо убрать галочку возле надписи «Build with runtime packages».
После этого нужно перейти на вкладку под названием «Linker» и снять галочку с Use dynamic RTL.
Вот и все – осталось нажать ОК и перекомпилировать проект.
Такой подход точно сработает в C++ Builder 6. По поводу других пакетов утверждать не буду, но, вероятнее всего, такого рода трюк сработает и там.
Единственный момент, если в своей разработке вы используете соединение с базой данных, то учтите, что при переносе на другую машину БД тоже должна перебраться (вместе с сервером, естественно).
БлогNot. C++ Builder: упаковываем "чужой" EXE в свой
C++ Builder: упаковываем "чужой" EXE в свой
Иногда удобнее скрыто добавить чужую утилитку в свою программу и запускать её оттуда, чем изобретать велосипеды. В качестве примера слинкуем приложение со стандартным калькулятором Windows.
Любым текстовым редактором создадим в папке проекта файл с именем a.rc и следующим содержимым: Эта строка формата "Имя_ресурса Тип_ресурса Имя_программы" полностью идентифицирует ресурс, а именно — программу calc.exe , которую можно будет "спрятать" в ресурсах нашего приложения.
Найдём в своей Windows файл стандартного калькулятора (в папке Windowssystem32 ) и скопируем его в папку проекта.
Присоединяем ресурс к проекту: меню Project, Add To Project. выбираем файл a.rc
По любому удобному событию, например, нажатию кнопки, запрограммируем запуск калькулятора:
По событию OnClose формы приложения предусмотрим удаление "распакованного" файла.
Для простоты здесь не контролируется, было ли удаление успешным:
После тестовой сборки проекта файл calc.exe можно удалить из папки приложения, его копия осталась в ресурсах.
P.S. Насколько помню, описанное было актуально для классического Borland C++ Builder 6. Если что-то из этого нужно и сейчас — вот более подробный файл.
Управление компонентами и ресурсами приложения в Borland C++ Builder 6, файл Word 2007 или выше (94 Кб)
12.11.2013, 20:46; рейтинг: 16842
Материалы к лекциям .
Ресурсы, которые может использовать приложение
Любая программа в Windows это не только код, но еще и набор данных типа картинок, строк, значков, диалоговых окон и так далее. Все это хранится внутри .exe модуля программы в виде ресурсов. То есть, ресурсы в Windows можно рассматривать как вид данных, которые уже инициализированы.
Ресурсы не загружаются в память вместе со всей программой, а находятся на диске до тех пор, пока их не вызовет программа. Это позволяет не плодить на диске лишние микрофайлы и экономить оперативную память при выполнении приложения.
Ресурсы возможно помещать в отдельные DLL библиотеки. Например если в DLL хранятся диалоговые окна, меню, строковые сообщения и т.п., то при необходимости их изменения не понадобится изменять сами программы.
Ресурсы можно разделить на два типа: двоичные и текстовые. Двоичные ресурсы это обычно растровые картинки, иконки, курсоры. а текстовые ресурсы это строки, шаблоны диалоговых окон и т.п.
Ресурсы в проектах приложений Borland C++ Builder хранятся раздельно. Файл проекта с расширением .DFM содержит информацию о ресурсах окон и компонентов для конструирования самой формы приложением. Он создается автоматически при создании проекта и изменяется при добавлении компонентов на форму. Другой файл с расширением .res (Project1.res) — файл графических ресурсов — хранит курсоры, иконки и рисунки.
Для редактирования графических ресурсов Borland C++ Builder предусмотрен редактор Image Editor. Он позволяет редактировать битовые изображения (.bmp), пиктограммы (.ico), курсоры (.cur), а также сами файлы ресурсов (.res и .dcr).
Файлы ресурсов .rc также могут быть подключены к проекту Borland C++ Builder. При компиляции проекта информация из файлов .rc и информация на которую они ссылаются будет помещена в файл с расширением .res, а ресурсы из этого файла перенесены в .exe файл и становятся доступны приложению.
Каждый тип ресурсов имеет свой идентификатор. Полный список ресурсов можно посмотреть в файле winuser.h .
Некоторые типы ресурсов:
RT_ACCELERATOR — таблица ускорителей;
RT_ANICURSOR — анимированный курсор;
RT_ANIICON — анимированная икона;
RT_BITMAP — растровая картинка;
RT_DIALOG — диалоговое окно;
RT_FONTDIR — набор шрифтов:
RT_HTML — HTML документ;
RT_MESSAGETABLE — таблица сообщений;
RT_RCDATA — данные определенные приложением (RAW);
RT_STRING — таблица строк:
RT_VERSION — ресурс версия;
RT_HTML -Документ HTML.
Таким образом — ресурсы это составная часть файлов .exe и .dll. Практически, при создании приложения, файлы ресурсов только переписываются в двоичном виде в .exe(.dll) файлы. Составляющие ресурсы извлекаются и используются по мере выполнения программы.
Для просмотра используемых приложением ресурсов можно использовать функцию WIN32 API EnumResourceTypes().
Поместим на форму один компонент TButton и определяем внешнюю функцию f_EnumFunc(), которая будет функцией перечисления:
В обработчике события нажатия кнопки TButton пишем код:
Цифры выдаваемые программой говорят о номерах ресурсов, которые использовал программист при ее написании.
.exe файл в ресурсах и его выполнение
Поставим целью спрятать в ресурсах создаваемого приложения некоторую другую программу, а в процессе выполнения приложения вызвать ее из ресурсов.
Поместим на форме компонент TMemo и два компонента TButton. В обработчике Button1Click напишем код:
Откомпилируем приложение, при нажатии кнопки Button1 в директории программы бедет содан файл со строчкой (которая отобразится в компоненте Memo):
Это строка "Имя ресурса | Тип ресурса | Имя программы" — полностью идентифицирует ресурс, а именно — программу calc.exe, которую можно будет спрятать в ресурсах приложения.
Далее, присоеденяем к проекту этот файл (Меню: Project/Add To Project.. выбираем a.rc файл).
Если сейчас попробовать откомпилировать проект, то компилятор выдаст ошибку. Причина — путь к calc.exe должен быть указан полный и, хотя ресурс еще не используется, но уже формируется. Поэтому скопируем calc.exe из директории Windows в директорию приложения (в противном случае необходимо указать полный путь).. Приложение компилирутся и можно начинать использовать ресурс. Удаляем файл "calc.exe" из директории проекта.
В обработчике Button2Click напишем код:
Здесь осуществляется выбор ресурса в поток — файла calc.exe (из файл "a.res", который уже создан). TResourceStream — потоковый класс, который обеспечивает доступ к компилируемым ресурсам в приложения. Он имеет множество методов для доступа к ресурсам, в том числе и для сохранения потока.
При нажатии на вторую кнопку калькулятор вызывается даже если его удалить не только из текущей директории приложения, но и из директории Windows.
Это не единственный способ вызова и запуска на выполнения .exe файла из ресурсов, но наиболее простой. Другие способы извлечения ресурсов и работы с потоками будут рассмотрены ниже — там где это или целесообразно, или другим способом задача не выполнима. При желании гурманы могут поэкспериментировать с TMemoryStream, WinExecute() и.т.п.
Текстовая информация в ресурсах
Помещение и извлечение текстовой информации, скопированной в ресурс из файла, и получение доступа к ней мало отличается от примера, описанного выше.
Создадим аналогичный проект с одним компонентом TMemo и двумя компонентами TButton. Шаги создания кода приложения будут аналогичны пройденным в предыдущем примере. Приведем лишь коды обработчиков событий нажатия кнопок.
Здесь одно отличие — тип ресурса вместо EXEFILE стал RT_RCDATA. После включения в проект файла "a.rc", не забудем поместить в дирректорию проекта любой файл readme.txt.
Последний обработчик имеет отличие от вызова программы связанное только с тем, что информация используется в самом приложении.
В результате при нажатии кнопки 2 файл "readme.txt" появляется в дирректории приложения (сколько его не удадяй) и отображается в компоненте Memo.
Картинки в ресурсах
Картинки можно поместить в ресурс как используя файл ресурсов проекта (project1.res) так и отдельный файл ресурсов, аналогично описанному выше хранению текста и программ.
Для рассмотрения первой возможности создадим новый проект и поместим на форму компонент TImage и два компонента TButton. В директорию проекта поместим любой рисунок в формате bmp (например "a.bmp") и откроем его в любом графическом редакторе, например в Microsoft Paint. Не компилируя проект запустим Image Editor (меню Tools/Image Editor). Далее откроем project1.res из директории проекта(File/Open, Projects/project1.res). Выполняем правый клик в поле открывшегося окна и в контекстном меню выбираем пункт New/Bitmap.
И сразу видим недостаток этого метода — максимальное число цветов для изображения — 256. Устанавливаем число цветов и размер (его определяем в Paint — меню Рисунок/Атрибуты). В файле у Contens появилась новая ветвь Bitmap с именем рисунка Bitmap1. (Можно воспользовавшись контекстным меню пунктом "Rename" и переименовать рисунок, например в MYBITMAP, но для наглядности делать этого не будем). Выполним двойной клик на имени рисунка — откроется окно редактора с пустым рисунком. Перенесем рисунок из Paint (ctrl+A, Ctrl+C) (можно и нарисовать свой рисунок в Image Editor) в окно Image Editor(ctrl+V). Закроем окно редактора рисунка и Image Editor, естественно на вопрос: "Save Changes. " кликнем "Yes".
Создадим обработчик нажатия для кнопки 2 и запишем несколько вариантов кода,позволяющего отображать и сохранять рисунок:
Откомпилируем и загрузим приложение, при нажатии кнопки 2 изображение появится в компоненте TImage.
Для рассмотрения использования отдельного файла ресурса в проект внесем некоторые изменения.
В обработчиках событий ButtonClick запишем коды, приведенные ниже. После компиляции и запуска приложения нажимаем первую кнопку и закрываем приложение. Добавляем к проекту файл "a.rc". Вновь компилируем и запускаем приложение и нажимаем вторую кнопку — картинка отображается в компоненте Image.
Пример полностью аналогичен предыдущему примеру, за исключением того, что для формирования файла .rc использован класс TStringList, а тип ресурса стал "RT_BITMAP".
Отображение рисунка возможно выполнить и немного по другому:
Редактирование картинок из ресурсов и отображение отредактированных картинок.
Следующие примеры показывают как можно извлекать ресурс картинки и внести в него коррективы. Зная структуру файла картинки, например, таким образом можно сделать надписи на картинках или наложить на рисунок из ресурса другой рисунок и т.п.
Тоже можно выполнить и чуть чуть по другому и с картинки из файла project1.res.
Иконки в ресурсах
Хранение иконок в ресурсах ничем не отличается от хранения рисунков.
Аналогично сначала используем иконку, поместив ее в ресурс через projekt1.res, а затем с использованием файла a.res.
Создадим новый проект на которой для данного примера достаточно поместить всего лишь два компонента Button. Не компилируя проект откроем projeсt1.res в Image Editor. Там уже есть веточка Icon с именем иконки MAINICON. Воспользовавшись контекстным меню пункт New/Icon, создаем новую иконку и переименуем ее в MAINICON1. Двойным кликом на имене иконки откроем графический редактор и нарисуем любой рисунок. Помним, что цвет левого нижнего пикселя является цветом прозрачности. Закроем редактор сохранив изменения в файле projeсt1.res.
Создадим обработчик нажатия для кнопки 2 и запишем следующий код:
Запускаем приложение. При нажатии кнопки 2 иконка меняется не только на форме окна приложения, но и в панели задач.
Следующий код показывает как можно получить информацию об иконке и как создается новая иконка, на основании структуры HICON. Кроме того здесь также показано как скопировать иконку в буфер обмена.
Структура ICONINFO общая для иконок и курсоров.
Для рассмотрения использования отдельного файла ресурса для работы с иконками в проект внесем некоторые изменения. В обработчиках событий ButtonClick запишем коды, приведенные ниже. После компиляции и запуска приложения нажимаем первую кнопку и закрываем приложение. Добавляем к проекту файл "a.rc". Вновь компилируем и запускаем приложение и нажимаем вторую кнопку — иконка меняется на нарисованную ранее (сохранена на предыдущем шаге) и в форме окна приложения, и в панели задач.
Курсоры в ресурсах
Использование ресурсов для манипуляций с курсорами во многом аналогично работе с иконками, но здесь есть и существенное отличие, речь о котором пойдет ниже.
Также как и ранее сначала создадим курсор в project1.res, а затем в файле a.res. Создадим новый проект на которой для данного примера поместим шесть компонент Button. Не компилируя проект откроем projeсt1.res в Image Editor. Так же как создавали иконку в предыдущем примере создадим курсор с именем MAINCURSOR и нарисуем его (любой рисунок, например черную стрелку). Закроем редактор сохранив изменения в файле projeсt1.res.
В секции private файла Unit1.h определим функцию vLoadCursor(). Эта функция необходима только для того, чтобы не повторять один и тотже код.
Тело функции опишем в файле "UNIT1.cpp" следующим образом:
Этот код показывает, что если удалось получить хэндл курсора, то его можно и подключить через массив Cursors свойств Screen. Об этом уже говорилось в разделе "Курсоры".
Создадим обработчик нажатия для кнопки 2 и запишем следующий код:
Откомпилируем и запустим приложение — нарисованный курсор появляется при нажатии на кнопку 2.
Для кнопки 3 создадим другой способ загрузки курсора.
Курсор загружается как и при нажатии на кнопку 2. О функции LoadImage() речь также уже шла.
Перейдем к использованию отдельного .res файла.
Для кнопки 1 напишем уже знакомый (новый только идентификатор ресурса RT_CURSOR) код:
Выполним этот код и в директории проекта будет создан файл "a.rc", содержащий строку:
На данном этапе отличия от предыдущего примера нет.
Скопируем в директорию проекта файл "Hand-i.cur" из директории "C:WindowsCursors" и добавим к проекту файл "a.rc" (Project/Add to Project), а в обработчиках Button4Click напишем код:
При запуске приложения все работает, курсор формы сменился со стрелки на руку. Но как загрузить курсор не сохраняя его в файле на диске. До этого и иконки и картинки можно было загрузить и использовать прямо из потока. Для курсоров такой возможности нет.
Остается один выход — либо хранить курсоры только в Файле ресурсов приложения, либо пойти по достаточно сложному пути, который описан в обработчике события нажатия кноки пять (Button5Click).
Таким образом эта проблема решена. Но она к сожалению не одна, и хотя это может быть и не надо, все же попробуем сохранить курсор из Файла ресурсов приложения на диске, тоесть сохранить курсор MAINCURSOR.
Причина возникшей трудности в самом файле ресурсов приложения. Если откроем "project1.res" и "a.res" в редакторе ресурсов Image Editor, то увидим суть различия в достуре к курсорам.

Строки символов в ресурсах
По аналогии с предыдущими примерами поместим на форме компонент Memo и два компонента Button. В обработчиках ButtonClick напишем код:
Выполнив ту же последовательность действий как и в предыдущих примерах получим в компоненте Memo при нажатии кнопки два строку:
HTML документы в ресурсах
Помещение HTML документов (файлов .html, .htm . ) в ресурсы полностью аналогично с примером помещения в ресурсы и использования .exe файлов. Поэтому здесь приводятся лишь коды приложения, форма которого имеет компонент TMemo и два компонента TButton, и которое выводит в браузере документ "a.html", а текст кода документа в компоненте Memo.
.wav и другие музыкальные файлы в ресурсах
По аналогии с предыдущими примерами оформим создание файла a.rc для формирования a.res в приложении, поместив на форме компонент TButton. Откомпилируем и выполним приложение, предварительно поместив в директорию приложения любой музыкальный файл, например a.wav.
Заметим, что идентификатора ресурса SOUND нет в списке идентификаторов ресурсов. Это говорит о том, что в файл ресурсов можно помещать и произвольную информацию — вопрос лишь в том, как ее потом оттуда извлечь и использовать.
Добавим на форму еще один компонент TButton и запишем код:
Содержимое файла, помещенное в ресурс, воспроизводится дважды (для обеспечения этой возможности добавлен флаг SND_SYNC). Однако, если повторить все тоже, но заменив тип ресурса "SOUND", например на "SOUND1", эти функции откажутся воспроизводить ресурс. Таким образом, хотя "SOUND" не определен как тип ресурса в файле winuser.h как некоторая константа (например MAKEINTRESOURCE(x) — где x некоторое число), функции считают, что в исполняемом файле находится ресурс именно с типом "SOUND".
И всетаки, хотя в этом и нет необходимлсти, для приведенных ниже кодов ресурс может иметь любой идентификатор отличный от "SOUND". Здесь используются уже знакомые по предыдущим параграфам потоки, которые позволяют найти практически произвольный ресурс и извлечь его из исполняемого модуля как двоичный код.
Используем TMemoryStream и функции поиска и фиксации ресурса.
Аналогично .wav файлам можно манипулировать и с любыми другими музыкальными файлами.





