Операционные системы. Учебное пособие. Марапулец Ю.В. - 40 стр.

UptoLike

Составители: 

#pragma data_seg(".myseg")
int sharedInts[10] ;
// другие переменные общего пользования
#pragma data_seg()
#pragma comment (lib, "msvcrt" "-SECTION:.myseg, rws") ;
Все переменные, объявленные между директивами #pragma data_seg(), размещают-
ся в сегменте .myseg. Директива #pragma comment () - не обычный комментарий. Она
дает указание библиотеке выполняющей системы пометить новый раздел как разрешен-
ный для чтения, записи и совместного доступа.
Для демонстрации принципа разработки DLL, создадим простую динамическую
библиотеку, содержащую только простую функцию DllMain() и одну внешнюю функ-
цию, которая получает строку символов и выводит ее в виде окна с сообщением.
#include <windows.h>
int WINAPI DllMain (HINSTANCE hInctance, DWORD fdReason, PVOID pvReserved)
{
return TRUE;
}
extern "C" __declspec (dllexport) int MyFunction(char *str)
{
MessageBox (NULL,str,"Function from DLL",MB_OK);
return 1;
}
Компиляция данного проекта приведет к созданию двух необходимых в дальней-
шем файлов - с расширениями .dll и .lib.
1.3.4. Подключение DLL
Практически невозможно создать приложение Windows, в котором не использова-
лись бы библиотеки DLL. В DLL содержатся все функции Win32 API и несчетное коли-
чество других функций операционных систем Win32. Вообще говоря, DLL - это просто
наборы функций, собранные в библиотеки. Однако, в отличие от своих статических род-
ственников (файлов .lib), динамические библиотеки не присоединены непосредственно к
выполняемым файлам с помощью редактора связей. В выполняемый файл занесена
только информация об их местонахождении. В момент выполнения программы загружа-
ется вся библиотека целиком. Благодаря этому разные процессы могут пользоваться со-
вместно одними и теми же библиотеками, находящимися в памяти. Такой подход позво-
ляет сократить объем памяти, необходимый для нескольких приложений, использующих
много общих библиотек, а также контролировать размеры ЕХЕ-файлов.
Однако если библиотека используется только одним приложением, лучше сделать
ее обычной, статической. Конечно, если входящие в ее состав функции будут использо-
ваться только в одной программе, можно просто вставить в нее соответствующий файл с
исходным текстом.
В случае использования динамических библиотек, как было сказано ранее, прило-
жение может активизировать размещенные в DLL процедуры двумя методами: поздни-
ми неявным и явным связыванием. Рассмотрим их более подробно.
1. Позднее неявное связывание. В данном случае приложение реализует динами-
ческое связывание во время загрузки за счет указания имен процедур из DLL непосред-
42
#pragma data_seg(".myseg")
int sharedInts[10] ;
// другие переменные общего пользования
#pragma data_seg()
#pragma comment (lib, "msvcrt" "-SECTION:.myseg, rws") ;

     Все переменные, объявленные между директивами #pragma data_seg(), размещают-
ся в сегменте .myseg. Директива #pragma comment () - не обычный комментарий. Она
дает указание библиотеке выполняющей системы пометить новый раздел как разрешен-
ный для чтения, записи и совместного доступа.
     Для демонстрации принципа разработки DLL, создадим простую динамическую
библиотеку, содержащую только простую функцию DllMain() и одну внешнюю функ-
цию, которая получает строку символов и выводит ее в виде окна с сообщением.

#include 

int WINAPI DllMain (HINSTANCE hInctance, DWORD fdReason, PVOID pvReserved)
{
       return TRUE;
}
extern "C" __declspec (dllexport) int MyFunction(char *str)
{
       MessageBox (NULL,str,"Function from DLL",MB_OK);
       return 1;
}

    Компиляция данного проекта приведет к созданию двух необходимых в дальней-
шем файлов - с расширениями .dll и .lib.

     1.3.4. Подключение DLL

      Практически невозможно создать приложение Windows, в котором не использова-
лись бы библиотеки DLL. В DLL содержатся все функции Win32 API и несчетное коли-
чество других функций операционных систем Win32. Вообще говоря, DLL - это просто
наборы функций, собранные в библиотеки. Однако, в отличие от своих статических род-
ственников (файлов .lib), динамические библиотеки не присоединены непосредственно к
выполняемым файлам с помощью редактора связей. В выполняемый файл занесена
только информация об их местонахождении. В момент выполнения программы загружа-
ется вся библиотека целиком. Благодаря этому разные процессы могут пользоваться со-
вместно одними и теми же библиотеками, находящимися в памяти. Такой подход позво-
ляет сократить объем памяти, необходимый для нескольких приложений, использующих
много общих библиотек, а также контролировать размеры ЕХЕ-файлов.
      Однако если библиотека используется только одним приложением, лучше сделать
ее обычной, статической. Конечно, если входящие в ее состав функции будут использо-
ваться только в одной программе, можно просто вставить в нее соответствующий файл с
исходным текстом.
      В случае использования динамических библиотек, как было сказано ранее, прило-
жение может активизировать размещенные в DLL процедуры двумя методами: поздни-
ми неявным и явным связыванием. Рассмотрим их более подробно.
      1. Позднее неявное связывание. В данном случае приложение реализует динами-
ческое связывание во время загрузки за счет указания имен процедур из DLL непосред-


                                          42