Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОП__подготовка.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
42 Кб
Скачать
☆
  1. Функции, обеспечивающие работу динамической библиотеки с компонентом.

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

CoFreeUnusedLibraries() – функция выгружает не используемые DLL, которые определены как удаляемые автоматически.

CoLoadLibrary –функция вызывается из CoGetClassObject при необходимости загрузить определённую DLL в процесс пользователя.

В начало

  1. Регистрация классов в реестре. Способы регистрации компонент в реестре.

Вся информация о компонентах фабрики классов интерфейса библиотеки типов находится в реестре.

Для использования компонента он должен быть зарегистрирован в реестре в веточке 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);//сравнение длин двух отрезков

В начало