Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 114, средняя оценка - 4.98
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
#1

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

05.08.2010, 18:05. Просмотров 15482. Ответов 0

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

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

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

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

Размер: 7.3 Кб

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

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

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

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

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

Размер: 7.0 Кб

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

Сохраним наш проект и запустим его. Запустится наш основной проект и в папке 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
Просмотров: 3003

Размер: 36.2 Кб

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

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

С уважением, Михаил.
46
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос DLL, как контейнер изображений. [FAQ] (C++ Builder):

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

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

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

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

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

DLL - как подменить функцию, используя самодельную DLL? - C++ Builder
Очень прошу пособить, кому не трудно... . Проблема в целом не сложная: имеется сторонняя программа (только exe), которая при определенном...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 18:05
Привет! Вот еще темы с ответами:

Как вшить в программу ssleay32.dll и libeay32.dll - C++ Builder
Доброе время суток. Для нормальной работы программы на другом компе с https, нужно рядом с прогой класть ssleay32.dll и libeay32.dll, сразу...

Вот нарыл рабочий проект, можно использовать как универсальный ответ на FAQ - C++ Builder
Реестр, ini файлы, просто файлы, диалоги, процессы, потоки, формы, вкладки, COM порт, Chart, ComboBox, StringGrid, Memo, вобщем, почти вся...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Как правильно передать контейнер указателей из другого класса? - C++ Builder
Доброго дня! есть структура: struct LicenseType // struct for license information parsed from an lmstat { AnsiString...


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

Или воспользуйтесь поиском по форуму:
1
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru