Освобождение захваченных ресурсов
Программа MDIDEMO в функции WinMain использует функцию LoadMenu для загрузки трех меню, определенных в файле описания ресурсов. Обычно Windows удаляет меню, когда закрывается окно, к которому меню относится. Это касается и меню MdiMenuIni t. Однако, меню, не относящиеся к какому бы то ни было окну (программе MDIDEMO это меню Hello и Rect), будут продолжать занимать некоторую область памяти, даже после завершения программы . Поэтому , для освобождения памяти, занимаемой меню Hello и Rect, в программе MDIDEMO функция DestroyMenu в WinMain вызывается дважды .
Значение оконной процедуры
Большая часть того, что в Windows создано для поддержки многооконного интерфейса, заключено в классе окна MDICLIENT. В этом совершенно отчетливо проявляется сила объектной архитектуры Windows. Оконная процедура окна - служит, как бы, связующим звеном между главным окном и различными окнами документов.
ЛЕКЦИЯ 9. ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
Типы связывания
До сих пор мы использовали множество функций API для создания окон и оконных процедур, рисования, работы с клавиатурой и мышью, ввода-вывода. Все эти функции работали исправно и вы не задумывались над вопросом: где расположены эти функции и каким образом они подключаются к вашей программе. Все, что вам необходимо было сделать, это подключить соответствующий заголовочный файл (чаще всего это был < windows . h >) и вызвать необходимую функцию. Все остальные действия по включению функции в вашу программу среда программирования делала автоматически. Теперь пришла пора рассмотреть механизмы, обеспечивающие возможность использования функций.
Начнем с рассмотрения самого обыкновенного механизма использования функции, определенной в вашей программе. Например, вы создаете программу вычисления факториала и определяете внутри программы функцию, которая непосредственно этот факториал вычисляет:
#include "iostream.h"
// Функция вычисления факториала
int NFactorial(int N)
{
if (N==1) return 1
else return NFactorial(N-1) * N;
}
// Основная программа
int main()
{
cout<<NFactorial(3)<<endl;
return 0;
}
Таким образом, ваша функция расположена прямо в тексте программы. Процесс компиляции приведенной выше программы можно отобразить следующей схемой:
Файл factorial . cpp Файл factorial . obj Файл factorial . exe
– 99 –
Рис.12.1 Компиляция программы со статическим связыванием первого вида
Приведенная на рисунке 12.1 схема отображает процесс статического связывания первого вида, когда функция расположена в самом тексте программы, при компиляции переводится в объектный код и помещается вместе с объектным кодом основной программы в один файл, который носит название объектного файла (*. obj ). После этого, компоновщик (программа связи) создает *.ехе файл, в который включены все объектные части программы и эти части связаны между собой посредством адресации. Вы можете вынести функцию в отдельный текстовый файл, включив его в проект и объявив в файле-заголовке *. h .
Статическое связывание второго вида подразумевает использование в вашей программе функций, определенных в других файлах (библиотеках). Файлы-библиотеки как правило имеют расширение *. lib и подключаются к вашему исполняемому файлу (*. exe ) только на этапе компиляции и связывания (Рис.2). Таким образом, они не компилируются заново, их объектный код (аналог файла *. obj ) уже существует, и прикомпилируется к вашему файлу (*. obj ) во время компиляции. Единственное, что необходимо сделать, это подключить нужный файл –заголовок (*. h ) в текст программы.
Рис.12.2 Компиляция программы со статическим связыванием второго вида
И, наконец, вы имеете возможность использовать динамически подключаемые библиотеки (*. dll ). Функции, находящиеся в них подключаются к вашему исполняемому файлу (*. exe ) только в момент вызова, то есть в тот момент, когда программа выполняется и идет обращение к указанной функции. Таким образом, функция не компилируется вместе с вашей программой, не участвует в процессе связывания и не содержится в вашем *. exe файле!!! Такой подход имеет неоспоримые преимущества:
·Часто используемые функции хранятся в отдельных файлах. Например все функции API реализованы в DLL и поставляются вместе с операционной системой. Таким образом, все программы под Windows имеют возможность использовать одни и те же функции.
·Нет необходимости помещать все функции программы в *. exe файл. Их можно подгружать по мере надобности.
·Возможность использования новых версий функций ( dll -файлов) без перекомпиляции исполняемых модулей ( exe -файлов).
Дата добавления: 2016-11-22; просмотров: 502;