- •Понятие компонента. Преимущества и недостатки использования компонентного подхода к проектированию программ.
- •Использование статических библиотек к проектированию программ: создание библиотеки, использование, распространение библиотек, достоинства и недостатки.
- •Динамические библиотеки с неявным связыванием: создание библиотеки, использование, распространение библиотек, достоинства и недостатки.
- •Разработка динамических библиотек с явным связыванием: создание библиотеки, использование, распространение библиотек, достоинства и недостатки.
- •Разработка клиентов динамических библиотек с явным связыванием. Функции, используемые для разработки клиента. Функция DllMain().
- •Основы com: понятие клиент-серверных систем, этапы взаимодействия клиента и сервера. Задачи, решаемые в com-технологии.
- •Именование com-объектов. Guid. Использование guid. Хранение guid в системе.
- •Теория интерфейсов. Виртуальная функция. Таблица виртуальных функций. Интерфейс iUnknown.
- •Интерфейс iUnknown. Метод QueryInterface(): параметры, возвращаемое значение, пример использования. Использование QueryInterface().
- •Реализация метода QueryInterface(). Правила использования QueryInterface().
- •Время жизни компонента. Метод AddRef() и Release(). Правила подсчета ссылок.
- •Время жизни компонента. Метод Release(). Правила подсчета ссылок.
- •Реализация компонента в виде динамической библиотеки. Диаграмма компонент.
- •Обработка ошибок в com. Hresult. Макросы succedeed() и fail().
- •Хранение guid в реестре. Информация о классе, хранимая в реестре. Инициализация com-библиотеки в клиенте.
- •Создание объектов при помощи функции CoCreateInstance(). Использование. Достоинства, недостатки.
- •Фабрика классов. Интерфейс iClassFactory(). Методы этого интерфейса. Метод GetClassObject().
- •Фабрика классов. Протокол использования фабрики классов с использованием интерфейса iClassFactory().
- •Функции, обеспечивающие работу динамической библиотеки с компонентом.
- •Регистрация классов в реестре. Способы регистрации компонент в реестре.
- •Динамическая библиотека с явным подключением
Функции, обеспечивающие работу динамической библиотеки с компонентом.
DLL с компонентами должна находиться в памяти до тех пор, пока есть обращение к данному компоненту. При этом COM-библиотека позволяет найти пассивные DLL с компонентом.
CoFreeUnusedLibraries() – функция выгружает не используемые DLL, которые определены как удаляемые автоматически.
CoLoadLibrary –функция вызывается из CoGetClassObject при необходимости загрузить определённую DLL в процесс пользователя.
В начало
Регистрация классов в реестре. Способы регистрации компонент в реестре.
Вся информация о компонентах фабрики классов интерфейса библиотеки типов находится в реестре.
Для использования компонента он должен быть зарегистрирован в реестре в веточке HKEY_CLSID.
Регистрация компонента выполняется при помощи утилиты regsvr32.exe с ключом –s.
Удаление из реестра выполняется той же самой утилитой.
Когда выполняется функция cmpmt.dll, в DLL вызывается функция DLLREGISTERSERVER.
Информация о COM-сервере (компоненте) хранится в реестре, в ключе, идентифицируемом по GUID'у.
В реестре принято задавать GUID'ы для интерфейсов.
Подраздел реестра или ключ, содержащий описание COM-компонента подписывается его GUID'ом. Внутри подраздела содержатся записи о расположении и имени программного модуля, в котором реализован интерфейс, ProgID компонента, VersionIndependentProgID и др. Кроме того, реестр содержит перечень ключей ProgID, в которых содержится соответствующий им GUID. Таким образом, реестр позволяет вести учёт компонентов, интерфейсов, фабрик классов, библиотек типов.
Метод QueryInterface(), который возвращает ссылку на объект по GUID’у выполняет:
1)поиск подраздела COM-компонента в реестре по его GUID
2)считывает из ключа ProgID размещение программного модуля, реализующего этот компонент
3)запускает этот программный модуль
4)возвращает указатель на интерфейс созданного модуля
В начало
Динамическая библиотека с явным подключением
#include <stdio.h>
#include <windows.h>
main()
{
// Дескриптор загружаемой dll
HINSTANCE h;
// Объявление указателя на функцию, вызываемой из DLL
void (*DllFunc) (char *str);
// Загружаем MyFirstDLL
h=LoadLibrary("MyFirstDLL.dll");
if (FAILED(h))
{
printf("Ошибка - не могу найти MyFirstDLL.dll\n");
return;
}
// Вызовом GetProcAddress получаем адрес функции Demo
// и присваиваем его указателю DllFunc с явным приведением типов.
DllFunc=(void (*) (char *str)) GetProcAddress(h,"Demo");
if (!DllFunc)
{
printf("Ошибка! В MyFirstDLL отсутствует ф-ция Demo\n");
return;
}
// Вызов функции Demo из DLL
DllFunc("Test");
// Выгрузка динамической библиотеки из памяти
FreeLibrary(h);
}
В начало
Динамическая библиотека с неявным подключением
#include <stdio.h>
#include <windows.h>
#include <mydll.h>
main()
{
//Вызов библиотечной функции
int result=mydllfunction("Demo");
}
В начало
Клиентская часть компонента
#include <stdio.h>
#include <windows.h>
#include <mydll.h>
main()
{
//Вызов библиотечной функции
int result=mydllfunction("Demo");
}
В начало
Динамическая библиотека
__declspec(dllexport) тип данных имя функции();»
{
Return значения типа данных;
}
В начало
Статическая библиотека
#include "math.h"
//__declspec(dllexport) double SegmentLength(int xa, int ya, int xb, int yb); //функция расчёта длины отрезка
double SegmentLength(int xa, int ya, int xb, int yb); //функция расчёта длины отрезка
//__declspec(dllexport) double SegmentLengthK(int xa, int ya, int xb, int yb, int k);//длина отрезка, умноженная на k
double SegmentLengthK(int xa, int ya, int xb, int yb, int k);//длина отрезка, умноженная на k//
//__declspec(dllexport) double SegmentLengthCompare(int xa, int ya, int xb, int yb, int xa1, int ya1, int xb1, int yb1);//сравнение длин двух отрезков
double SegmentLengthCompare(int xa, int ya, int xb, int yb, int xa1, int ya1, int xb1, int yb1);//сравнение длин двух отрезков
В начало
