Повторное использование разработанных кодов___________________439

6. Выполните команду File | New и выберите в окне New Items на странице New
пиктограмму Text. Вы попадете в окно Редактора Кода, куда будет загружен
текстовый файл. Его расширение — .txt.

7. Сохраните файл командой File | Save с именем MyDLL.h. При сохранении на-
пишите в диалоговом окне имя файла с расширением ,h, так как иначе по
умолчанию он сохранится с расширением .txt. Сохранить файл ранее, чем в
нем будет записан код, полезно потому, что при расширении .txt в Редакторе
Кода не будет работать автоматическое выделение цветом синтаксических
единиц. Это затруднит написание кода.

8. Запишите в файл следующий код:

ftifndef _MYDLL_H
ttdefine _MYDLL_H

#ifdef _DLL_

# define DLL_EI _decispec(dllexport)
ttelse

# define DLL El   decispec(dllimport)
ttendif

extern "C" char * DLL El Code_Dec(char *s, char Key);

#endif

9. Сохраните этот заголовочный файл.

Давайте всмотримся в приведенный текст заголовочного файла. Посмотрите
на фрагмент, начинающийся с директивы #ifdef. Использованный в нем иденти-
фикатор DLL_EI может быть любым — это просто произвольный идентификатор.
А логика работы данного фрагмента следующая: если определен идентификатор
_DLL_, то идентификатор DLL_EI раскрывается как _declspec(dllexport); если
же _DLL_ не определен, то идентификатор DLL_EI раскрывается как _decls-
pec(dllimport). C++Builder автоматически определяет _DLL_ в случае, если со-
здается проект DLL, и не определяет этот идентификатор при создании объекта
приложения. Таким образом, в зависимости от того, включается ли заголовочный
файл в библиотеку или в приложение, он будет выглядеть по-разному. При компи-
ляции библиотеки строка, определяющая нашу функцию Code_Dec, после раскры-
тия макроса будет восприниматься как

extern "С" char * _decispec(dllexport) Code_Dec(char *s, char Key);

Здесь конструкция _declspec(dllexport) означает, что функция может экс-
портироваться из библиотеки, то есть может вызываться внешними приложения-
ми. Подобным образом должны быть перечислены все функции DLL, предназна-
ченные для прямого использования в приложениях. Помимо таких функций в
DLL могут быть вспомогательные функции-утилиты, предназначенные только для
использования другими функциями. Подобные утилиты не должны определяться
как экспортируемые.

Когда тот же заголовочный файл включается в приложение, то эта же строка
после раскрытия макроса имеет другой вид:

extern "С" char * _decispec(dllimport) Code Dec(char *s, char Key);

Здесь конструкция _declspec(dllimport) означает, что функция импортирует-
ся, то есть вносится в модуль из DLL. Таким образом один и тот же заголовочный
файл может использоваться и при создании DLL, и в приложениях, обращающих-
ся к данной DLL.

Продолжим создание нашей DLL.