Динамически компонуемые библиотеки, страница 2

Функция AddNumbers определена как экспортируемая (с точки зрения DLL), и ей присвоен порядковый номер 1. Задавать порядковый номер необязательно. Когда номер опущен, он присваивается компоновщиком автоматически. Если файл объекта, созданный из предыдущего примера исходного кода, связать с данным файлом описания модуля, получится динамически компонуемая библиотека.

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

Поскольку динамическое связывание во время загрузки требует разрешения всех ссылок на этапе компиляции/компоновки, сначала необходимо создать файл заголовков (.Н), который описывает подпрограммы из DLL. Обычно файл заголовков содержит описания прототипов всех общедоступных точек входа в DLL, а также любые структуры и определения. Для предыдущего фрагмента кода файл заголовков имеет следующий вид:                                                                                                               '

// Файл заголовков для MYDLL.DLL — описывает точки входа int AddNumbers (int nl, int n2) ;

Приложения, реализующие динамическое связывание с DLL во время загрузки, должны включать этот файл, чтобы иметь описание подпрограммы AddNumbers. Для компилятора этого достаточно. Однако компоновщику необходимо знать местонахождение подпрограммы. Обычно это осуществляется путем связывания приложения с библиотекой импорта (import library), созданной из файла описания модуля. Библиотека импорта указывает компоновщику, что подпрограмма AddNumbers находится в файле MYDLL.DLL. Многие платформы разработки создают библиотеки импорта автоматически. Если же требуется создать такую библиотеку самостоятельно, можно воспользоваться утилитой LIB.EXE:

lib /machine:IX86 /OUT:mydll.lib /DEF:mydll.def

В этом примере создается библиотека импорта, пригодная для платформ на базе процессора х86. Приложение будет включать библиотеку MYDLL.LIB. Она служит входной информацией для компоновщика и обеспечивает корректное разрешение ссылок на DLL.

Если DLL не сопровождается библиотекой импорта, для информирования модуля подключения о местонахождении подпрограмм из DLL приложение должно использовать файл определений модуля. Этой цели служит раздел IMPORTS файла опоп-ределений модуля. Для рассматриваемого примера приложения файл определений модуля должен содержать следующие строки:

IMPORTS

MyDll.MyDllFunc

Доступ к данным в DLL

Когда DLL динамически распределяет память, это выполняется от имени процесса, который обращается к DLL. Доступ к распределенной памяти возможен только для потоков, принадлежащих данному процессу. Это относится к памяти, выделяемой с использованием GlobalAlloc, LocalAlloc, HeapAlloc, VirtualAlloc или любой из стандартных подпрограмм библиотеки С, таких как malic и new.

Если DLL динамически распределяет память таким образом, что она может быть доступной всем процессам, использующим библиотеку в данный момент, DLL должна применять функции отображения файлов (file-mapping) для создания поименованной обшей памяти. Более подробное описание отображения файлов содержится в главе 17.

Глобальные и статические переменные, объявленные в исходном коде DLL, находятся в сегменте данных DLL. Каждому процессу, присоединенному к DLL, предоставляется собственная копия этого сегмента данных.

Для файла описания модуля возможно изменение стандартных атрибутов глобальных и статических данных, что предоставляет общий доступ к данным для всех процессов, использующих DLL. Например, в результате включения следующей строки в файл определений модуля все инициализированные данные будут распределяться между всеми процессами, а неинициализированные данные останутся приватными для каждого процесса. Этот оператор требует, чтобы в исходном файле DLL было указано, какие данные необходимо поместить в сегмент данных .GLOBALS. Пример содержится в описании функции DLLEntryPoint.

SECTIONS

.GLOBALS READ WRITE SHARED