Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/352: Рейтинг темы: голосов - 352, средняя оценка - 4.90
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540

DLL, как контейнер изображений. [FAQ]

05.08.2010, 18:05. Показов 70199. Ответов 0

Студворк — интернет-сервис помощи студентам
Последнее время часто слышу от пользователей вопросы о том, как хранить изображения в DLL и в дальнейшем их использовать в своём приложении...
Подобные вопросы заставили меня написать эту статью, в которой я попытаюсь рассмотреть вопрос хранения изображений в DLL и их дальнейшее использование.

Прежде всего необходимо представлять, когда же необходимо использовать подобные контейнеры. Представьте себе, что вы захотели создать приложение, содержащее много вкладок, каждая из которых должна обладать собственным фоном. Или же приложение, представляющее из себя тестовую систему, в которой вопросы содержат иллюстрированный материал. Можно попросту добавить все изображения непосредственно в основной исполняемый файл... И вот здесь и возникает проблема: представьте себе, каков объём будет у такого приложения?! Некоторые пытаются сохранить все изображения рядом с приложением, или в отдельной папке... данная методика работает, но предоставляет пользователю право изменять содержимое безо всякого труда.
Используя Dynamic-Link Library нам открывается возможность сохранения всех используемых ресурсов в едином файле. Также, мы сами в состоянии определять когда необходимо использовать то, или иное изображение...

Итак, первым делом, создадим основной проект.
File -> New -> VCL Forms Application.

На форму поместим компонент TImage (из вкладки Additional) и TButton (из Standart).
Пока что работа с проектом завершена. Сохраним и запустим наш проект:
Название: Project1.png
Просмотров: 3270

Размер: 7.3 Кб

Теперь приступим к созданию нашей библиотеки.
File -> New -> Other -> C++ Builder Projects -> Dynamic-link Library


Указываем тип: С++.
Библиотека в данном случае нам нужна для хранения ресурсов, поэтому нам не нужна VCL (библиотека визуальных компонентов) и мы смело отказываемся от Use VCL:


Таким образом, мы уменьшим размер нашей библитеки в среднем на 0.5 мб

Библиотека создана. Теперь необходимо добавить ресурсы, которые в дальнейшем будем использовать. Часто возникают вопросы о том, как использовать формат PNG. Для примера я рассмотрю именно этот формат. Итак, берём нужные изображения и добавляем их в проект. Сделать это можно нажав Project -> Add to project ..., либо просто перетащив файлы на созданный проект библиотеки:


После того, как мы добавили нужные ресурсы, можно посмотреть, какой идентификатор ресурса был присвоен каждому изображению (идентификатор ресурса необходим для дальнейшего обращения к файлам):
Название: ResId.png
Просмотров: 3374

Размер: 7.0 Кб

В Project Manager выберем режим сборки Release, дважды кликнув по нему.
Теперь необходимо указать главное приложение (наш созданный ранее проект). Для этого укажем путь к исполняемому файлу:
Run -> Parameters -> Host Application:


Сохраним наш проект и запустим его. Запустится наш основной проект и в папке Release появится библиотека (Проект я назвал CoreUI, поэтому библиотека будет иметь название CoreUI.dll).

Вернёмся к нашему основному проекту.

В Unit1.cpp добавим библиотеку для работы с PNG-обьектами: #include "PngImage.hpp"
Перед конструктором создания обьекта Form1 добавим строку:
C++
1
HANDLE h = LoadLibrary("CoreUI.dll");
Таким самым мы виртуально присоединим библиотеку к проекту.

После этого обработаем событие OnClick в Button1:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TPngImage *tmpPNG = new TPngImage;
 
  if (Button1->Tag == 0) {
    tmpPNG->LoadFromResourceName((unsigned int)h,"PNGIMAGE_1");
    Button1->Tag = 1;
  } else {
    tmpPNG->LoadFromResourceName((unsigned int)h,"PNGIMAGE_2");
    Button1->Tag = 0;
  }
 
  Image1->Picture->Assign(tmpPNG);
  delete tmpPNG;
  tmpPNG = NULL;
}
//---------------------------------------------------------------------------
Комментарии к коду

Создадим динамический объект класса TPngImage
C++
1
TPngImage *tmpPNG = new TPngImage;
Загрузим в него изображение PNG из библиотеки. Для этого воспользуемся идентификатором h и идентификатором ресурса "PNGIMAGE_1":
C++
1
tmpPNG->LoadFromResourceName((unsigned int)h,"PNGIMAGE_1");
Присвоим обьект:
C++
1
Image1->Picture->Assign(tmpPNG);
И освободим память.


Запускаем проект и любуемся результатом.
Название: Ready.png
Просмотров: 3366

Размер: 36.2 Кб

Если у кого-то остались какие-то вопросы, скачать проект можно по адресу: http://msdn.at.ua/temp/ImgInDll/WorksDll.rar

DLL возможно использовать не только как контейнер изображений.
О способах использования и проецирования DLL вы можете прочитать в статье: Dynamic-Link Library: Теория + Практика.

С уважением, Михаил.
47
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2010, 18:05
Ответы с готовыми решениями:

DLL, как контейнер изображений.
Тут прилеплена тема DLL, как контейнер изображений. На скриншоте показано окно с параметрами добавленного изображения(там идентификатор...

Builder 6. DLL, как контейнер для изображений
Вот в этой статье все замечательно расписано про DLL как контейнер для изображений. Возможно глупый вопрос, но в С++ Builder 6 этот процесс...

DLL как контейнер языковых файлов
Доброе утро! Прошу совета у опытных программистов! :) Разумно ли использовать DLL как контейнер языков приложения? :) Если да то...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2010, 18:05
Помогаю со студенческими работами здесь

Использование dll как контейнер для файлов в builder 6
Пишу игру. Нужно спрятать BMPшные картинки в dll и прямо оттуда их загружать в Image. Как это реализовать именно в 6'ом builder'е?

Загрузка jpg изображений из dll
Здравствуйте. Я понимаю, что темы с таким названием уже существуют, но ответа в них я так и не нашел... Я разобрался как создать dll, но в...

DLL - контейнер текстовых файлов, как редактировать текст?
Есть DLL, в которую вложены текстовые файлы в качестве ресурсов. Кроме ресурсов в DLL нет ничего, т.е. это DLL-контейнер. Чтение текста...

Контейнер изображений
создал вот такой контейнер: QList <QPixmap> Image; как теперь его заполнить (загрузить изображения)? append в параметры нужно константное...

Невизуальный контейнер для однотипных изображений
Здрасте. Кокой из стандартных типов (или структур) делфи лучше использовать для загрузки изображений, идентичных по качеству, размеру и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Закрытая тема Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru