- •Лабораторные работы по курсу «Современные технологии и инструментарий программирования»
- •1. Разработка и использование «обычных» библиотек dll (cui)
- •1.1.Бесценные методические приказания
- •2.Разработка и использование dll-расширения
- •Ознакомиться с теоретической частью работы, для чего придется изучить раздел конспекта «Разработка и использование собственных dll», особенно подраздел «Основы dll».
- •2.1.Разработка библиотеки-расширения
- •2.2.Разработка клиентского приложения для dll-расширения
- •3.Разработка внутрипроцессного сервера и клиентского приложения с использованием atl
- •Часть 1. Разработка простого внутрипроцессного сервера сом, реализованного в виде библиотеки dll
- •Interface iMathem2; // добавлено
- •Часть 2. Разработка клиентского консольного приложения для тестирования внутрипроцессного сервера сом
- •4.Разработка и использование локального сервера
- •Часть 1. Разработка локального сервера сом
- •Часть 2. Разработка клиентского приложения для локального сервера сом
- •Литература
- •7. Проект New_Syntax
- •8. Руководство_по_c#.Doc
2.Разработка и использование dll-расширения
Студент, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование
Фредерик Брукс-младший
Цель работы – освоение технологии разработки и использования DLL-расширений (MFC Extension DLL). В рамках этой работы мы построим библиотеку DLL-расширение, которая будет экспортировать класс CGraphic, предназначенный для построения графика любой (одномерной) функции. Далее надо разработать простое клиентское приложение, использующее эту библиотеку (2 час.).
Задание. Рекомендуемая последовательность выполнения работы:
Ознакомиться с теоретической частью работы, для чего придется изучить раздел конспекта «Разработка и использование собственных dll», особенно подраздел «Основы dll».
Создать библиотеку DLL-расширение, экспортирующую некоторый класс.
Создать клиентское приложение, подключив к нему библиотеку DLL-расширение. Это приложение будет создавать объект класса, тип которого описан в библиотеке.
2.1.Разработка библиотеки-расширения
Методические указания. В целом последовательность создания собственного DLL-расширения MFC включает следующие основные этапы:
создание каркаса библиотеки с помощью мастера MFC AppWizard (dll);
добавление в библиотеку класса (классов);
компиляция и сборка библиотеки.
Это все правильно, если класс уже есть, причем отлаженный, а ежели его нет? Тогда надо сначала разработать и отладить класс, а уже потом создавать библиотеку и включать в нее класс. Хотя, как говорилось выше, можно заниматься и отладкой библиотеки при наличии, естественно, клиентского приложения.
Шаг 1. Создание тестового клиентского приложения для отладки класса.
Создайте приложение с графическим интерфейсом пользователя (GUI), отключите в нем поддержку архитектуры документ/вид. Собственно, нам необходимо простейшее приложение, в котором мы могли бы отладить класс, предназначенный для построения графика некоторой функции. Назовите проект, допустим, TestCls, хотя это и не имеет решающего значения.
В качестве примера предлагается разработать класс, предназначенный для построения графика функции одного аргумента. График функции будет выглядеть так, как на рис. 1.
|
Рис. 1. Реализация класса для построения графика функции в действии
Если вам такой класс покажется ну совсем уж не заслуживающим вашего внимания – напишите свой, лучший, или доработайте предлагаемый.
Итак, добавьте в приложение новый класс (ProjectAdd class) и не забудьте выбрать шаблон класса «С++ Class». Если вы его нарекли как CGraphic, то получите два файла: Graphic.h и Graphic.cpp. Доведите содержимое этих файлов до приведенного ниже вида и осмыслите приведенный код.
|
|
|
|
// выбираем новое перо CPen newPen(PS_DOT,2,(COLORREF)255); /* красное перо шириной 2 пиксела*/ cdc.SelectObject(&newPen); // рисование графика double scx,scy; if(fabs(X[0])>X[Count-1]) scx=fabs(X[0])/(Width/2); else scx=X[Count-1]/(Width/2); double maxy=fabs(Y[0]); for(int i=1;i<Count;i++) if(maxy<fabs(Y[i])) maxy=fabs(Y[i]); scy=maxy/(Height/2); scy*=1.1; scx*=1.1; int ix,iy; ix=X[0]/scx+xc; iy=-Y[0]/scy+yc; cdc.MoveTo(ix,iy); for(int i=1;i<Count;i++) { ix=X[i]/scx+xc; iy=-Y[i]/scy+yc; cdc.LineTo(ix,iy); } ////////////////////////////////////////////////////// cdc.SelectStockObject(BLACK_PEN); // newPen отсоединяется return true; }
|
Шаг 2. Включение класса в тестовое приложение.
Если вы создали тестовое приложение в соответствии с приведенными выше рекомендациями, то в вашем проекте будет файл с именем ChildView.cpp. Добавьте в начало этого файла директивы препроцессора:
#include "Graphic.h"
#include <math.h>
Класс CGraphic можно использовать по-разному, многими способами. Главное – передать конструктору класса указатель на окно, в котором должен быть прорисован график. Если после вывода графика его надо перерисовать в связи с тем, что требуется обновить изображение в окне по какой-либо веской причине (окно было перекрыто, были изменены его размеры и т.п.), то требуется повторно вызвать метод класса DrawGraphic().
В данном случае мы поступим примитивно и поместим весь код в метод CChildView::OnPaint(), который вызывается системой всякий раз, когда содержимое окна надо обновить (то что доктор прописал!). Итак, наполните этот метод таким немудреным кодом:
|
Если вы бог, то программа должна сразу откомпилироваться и работать «как часы». В противном случае у вас появится возможность проявить свои недюжинные способности в отладке программы. Проверьте, что при изменении размеров окна график, как по мановению волшебной палочки, быстренько перерисовывается, а по завершению программы в окне Debug нет оскорбляющих ваше самолюбие сообщений вроде “Memory leaks …”.
Шаг 3. Создание каркаса библиотеки DLL-расширения.
Выполните, как обычно при создании нового проекта, команду FileNew Project и в появившемся окне задайте Project types==MFC, Templates==MFC DLL, Name==ExtDLL. Навалитесь на ОК, на вкладке Application Settings выберите (обязательно!) DLL type==MFC extension DLL, налягте на Finish. Поставьте свечку в церкви во благополучие Вашего проекта и возвращайтесь к продолжению работы.
Просмотрите и проанализируйте файл ExtDLL.cpp, который содержит, кроме директив препроцессора, только заготовку функции DllMain(). Сравните: в обычной (RegDLL) библиотеке этой функции не было, так что свечку вы покупали не напрасно.
Шаг 4. Включение в библиотеку класса CGraphic.
Скопируйте файлы Graphic.h и Graphic.cpp в каталог этого проекта библиотеки и с помощью команды меню ProjectAdd Existing Item выберите и включите эти файлы в проект. Пока вы никаких видимых изменений в файлах проекта не заметите, даже если и обладаете экстрасенсорными способностями и умеете ходить туда-сюда не только по прототипам, но и по виртуальным реальностям.
Шаг 5. Редактирование файла Graphic.h.
В этом файле надо заменить строку
class CGraphic
на следующую
class AFX_EXT_CLASS CGraphic
Макрос AFX_EXT_CLASS намекает на то, что этот класс экспортируется библиотекой. Клиентское приложение, использующее библиотеку, тоже должно в соответствующем заголовочном файле (Graphic.h) содержать этот макрос.
Шаг 6. Постройте библиотеку с помощью команды меню BuildBuild ExtDLL.dll.
В папке …\ExtDLL\Debug вы должны обнаружить файлы ExtDLL.dll и ExtDLL.lib. Если их там нет, значит, они были съедены вирусами, которым очень нравятся библиотеки.
