Глобальные переменные и файлы в DLL
Как правило, DLL не является "владельцем" каких-либо откры- ваемых ей файлов или получаемых ей от системы глобальных блоков памяти. Такими объектами владеет (прямо или косвенно) сама прик- ладная программа, вызывающая DLL.
Когда прикладная программа завершает работу, любые открытые файлы, владельцем которых она является, автоматически закрывают- ся, а все принадлежащие ей глобальные блоки памяти автоматически освобождаются. Это означает, что описатели данных файлов и блоков памяти, записанные в DLL в глобальных переменных, могут в любое время стать недопустимыми без уведомления DLL. По этой причине DLL не следует полагаться на допустимость описателя файла и гло- бальных описателей памяти, хранящихся между обращениями к DLL в глобальных переменных. Такие описатели следует сделать параметра- ми процедур и функций DLL, и вызывающая прикладная программа должна отвечать за их поддержку.
В Windows глобальные блоки памяти, распределенные с атрибу- том gmem_DDEShare (определенные в модуле WinTypes), принадлежат DLL, а не вызывающим прикладным программам. Такие блоки памяти остаются распределенными, пока они явно не освобождаются DLL, или пока DLL не выгружается.
Администратор памяти защищенного режима DOS не поддерживает совместно используемых блоков памяти и игнорирует флаг gmem_DDEShare. В защищенном режиме DOS распределяемые DLL блоки памяти всегда принадлежат вызывающей библиотеку DLL программе.