На этом шаге мы перечислим преиущества использования DLL.
Начиная с 27 шага мы рассматривали создание сервера автоматизации, выполненного в виде исполняемого файла. Однако нередко сервер автоматизации размещается в динамически загружаемой библиотеке (DLL). При обращении к такому серверу происходит загрузка библиотеки (если ранее она не была загружена) и запуск вызываемой функции. Начиная с этого шага сначала мы рассмотрим создание традиционных библиотек, не содержащих СОМ-объектов, а затем обсудим особенности реализации сервера автоматизации в виде DLL.
Сейчас речь пойдет о традиционных библиотеках, которые не содержат СОМ-объектов. Большая часть из сказанного далее верна и для DLL с СОМ-объектами, отличия же будут специально выделяться.
Динамически загружаемые библиотеки являются, пожалуй, одним из наиболее мощных средств создания приложений в Windows. По структуре данных DLL напоминает исполняемый файл (ЕХЕ-файл), но в отличие от исполняемого файла код, содержащийся в DLL, не может выполняться самостоятельно. Зато библиотека (так же как и ЕХЕ-файл) может быть загружена в память компьютера, и работающие приложения могут вызвать экспонируемые в DLL функции. На основе DLL создаются элементы управления ActiveX.
Преимущества использования DLL следующие. Прежде всего, функции, описанные в DLL, могут одновременно обслуживать несколько приложений. При этом сами функции хранятся в памяти в виде единственной копии. Если вызываемый код достаточно велик и имеется несколько приложений, которые вызывают данный код, достигается существенная экономия системных ресурсов.
Второе преимущество - возможность хранения общих ресурсов. Опять же, если несколько приложений работают с одними и теми же ресурсами (например, с большими растровыми изображениями - BMP-файлами), то достаточно сохранить в DLL единственную копию этих ресурсов.
Третье преимущество - поддержка новых версий приложений. Если программистом были сделаны какие-либо изменения в реализациях функций, определенных в DLL, то конечному пользователю достаточно передать новую версию DLL - ЕХЕ-файл можно оставить прежним. Это особенно актуально сейчас, когда версии многих приложений можно изменять через Интернет, и важно минимизировать объем данных, передаваемых при таком обновлении. Естественно, если часть кода реализована в виде DLL, то при загрузке с сервера только этой библиотеки сетевой трафик окажется ниже, чем при загрузке приложения целиком.
Четвертое преимущество заключается в возможности использования различных языков программирования для создания ЕХЕ- и DLL-файлов. Например, ЕХЕ-файл может компилироваться из кода, написанного на Delphi, a DLL-файл, который им используется, из кода, написанного на Microsoft Visual C++. Если приложение использует несколько библиотек, то они могут быть созданы на различных языках программирования. Это значительно упрощает перенос кода в другие приложения.
И, наконец, библиотеки можно загружать в память только тогда, когда они требуются для выполнения приложений - такое их применение называется динамической загрузкой. При этом опять же достигается экономия системных ресурсов. Так, например, в DLL можно реализовать диалоговое окно для изменения каких-либо параметров приложения. Пользователь может месяцами не обращаться к данному диалоговому окну, и при этом библиотека, в которой оно реализовано, не загружается в память и не потребляет системных ресурсов. Только в тот момент, когда пользователь обращается к данному диалоговому окну, происходит загрузка DLL в память, но после окончания использования диалогового окна эта память освобождается. Благодаря динамической загрузке можно создать динамический пользовательский интерфейс - в этом случае соответствующие пункты меню появляются при наличии данной библиотеки и исчезают при ее отсутствии. Такой интерфейс удобен при поставке приложений, в которых пользователь за отдельную плату может заказать дополнительные функциональные возможности.
На следующем шаге мы рассмотрим создание простейшей библиотеки.