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

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

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

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

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

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

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

Размер: 7.3 Кб

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


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


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

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


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

Размер: 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
Просмотров: 3371

Размер: 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
Закрытая тема Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru