Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Замечания по программированию библиотек

В следующих разделах описаны некоторые важные моменты, кото-

рые следует иметь в виду при работе с DLL.

Глобальные переменные в dll

DLL имеет свой собственный сегмент данных, и любая описанная

в DLL переменная является локальной для этой DLL. DLL не может

получить доступ к переменным, описанным в вызывающих DLL модулях,

и не может экспортировать переменные в другие модули. Такой дос-

туп должен реализовываться через процедурный интерфейс.

Глобальные переменные и файлы в dll

Как правило, DLL не является "владельцем" каких-либо откры-

ваемых ей файлов или получаемых ей от системы глобальных блоков

памяти. Такими объектами владеет (прямо или косвенно) сама прик-

ладная программа, вызывающая DLL.

Когда прикладная программа завершает работу, любые открытые

файлы, владельцем которых она является, автоматически закрывают-

ся, а все принадлежащие ей глобальные блоки памяти автоматически

освобождаются. Это означает, что описатели данных файлов и блоков

памяти, записанные в DLL в глобальных переменных, могут в любое

время стать недопустимыми без уведомления DLL. По этой причине

DLL не следует полагаться на допустимость описателя файла и гло-

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

глобальных переменных. Такие описатели следует сделать параметра-

ми процедур и функций DLL, и вызывающая прикладная программа

должна отвечать за их поддержку.

В Windows глобальные блоки памяти, распределенные с атрибу-

том gmem_DDEShare (определенные в модуле WinTypes), принадлежат

DLL, а не вызывающим прикладным программам. Такие блоки памяти

остаются распределенными, пока они явно не освобождаются DLL, или

пока DLL не выгружается.

Администратор памяти защищенного режима DOS не поддерживает

совместно используемых блоков памяти и игнорирует флаг

gmem_DDEShare. В защищенном режиме DOS распределяемые DLL блоки

памяти всегда принадлежат вызывающей библиотеку DLL программе.

Dll и модуль System

В продолжении существования DLL переменная HInstance содер-

жит описатель экземпляра DLL. Переменные FPrevInst и CmdShow в

DLL всегда равны 0 (как и переменная PrefixSeg), поскольку DLL не

имеет префикса программного сегмента (PSP). В прикладной програм-

ме PrefixSeg никогда не равна 0, поэтому проверка PrefixSeg <> 0

возвращает True, если текущем модулем является прикладная прог-

рамма, и False, если текущим модулем является DLL.

Чтобы обеспечить правильную работу администратора динамичес-

ки распределяемой области, содержащегося в модуле System, код за-

пуска библиотеки устанавливает переменную HeapAllocFlags в значе-

ние gmem_Moveable + gmem_DDEShare. В Windows это приводит к тому,

что все блоки памяти, распределенные через процедуры New и

GetMem, будут принадлежать DLL, а не вызывающей ее прикладной

программе.

Примечание: Подробности об администраторе памяти вы

можете найти в Главе 21.

Соседние файлы в предмете Программирование на Pascal