Основным средством разработки NLM-модулей, загружаемых на файловом сервере, является компилятор Novell/Watcom C Network Compiler/386. Это связано с тем, что только этот С-компилятор имеет в своём составе редактор NLMLINK, позволяющий компоновать NLM-модули.
Следует отметить, что компоновщик WLINK, входящий в состав компилятора Novell/Watcom Network C for DOS (средство разработки приложений для DOS-рабочей станции), также позволяет создавать NLM-модули.
Для разработки NLM-модуля необходимо выполнить следующие действия:
WMAKE -f make-файл имя.nlm # Описание переменных make-файла, используемых при # задании параметров программ переменная=значение переменная=значение ....... # Определение имени компилятора .C.OBJ: wcl386 параметры # Описание состава obj-файлов имя.obj: имя.с имя.с ...... имя.h имя.obj: имя.с имя.с ...... имя.h ...... # Описание состава NLM-модуля имя.nlm: имя.obj имя.obj ..... файл_определений.def # Описание имени компоновщика nlmlink файл_определений
Рис. 4.1. Описание make-файла, используемого при создании NLM-модуля
В make-файле описываются имена компилятора и компоновщика, а также состав каждого obj-файла и nlm-файла. Если С-файл был изменён, то после запуска утилиты WMAKE выполняется компиляция этого файла и перекомпоновка obj- и nlm- файла.
Файл определений, имя которого указывается в make-файле, имеет расширение DEF и содержит информацию для компоновщика. В таблице 4.1 приведены ключевые слова, используемые в файле определений.
Таблица 4.1. Ключевые слова файла определений
Ключевое слово | Описание | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DESCRIPTOR | Строка до 127 символов, заключённая в двойные кавычки. Эта строка будет отображаться на консоли при выполнении команды файлового сервера MODULES. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INPUT | Список модулей и файлов для компоновки. Может содержать имена требуемых obj-файлов и файлов со списками obj-файлов. Файл со списком обозначается как @имя_файла. Каждая строка этого файла должна начинаться с пробела. В этом списке должен быть указан путь к файлу PRELUDE.OBJ. Модуль PRELUDE устанавливает среду NLM-программы с помощью распределения и инициализации внутренних структур данных, создания экрана для использования его NLM-программой, разборки параметров командной строки для передачи их в процедуру main() как аргументов вида argc и argv, старта новой нити для выполнения процедуры main(). Пример: INPUT NW3NLM E:\WC386\PRELUDE @E:\WC386\A1.MOD | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OUTPUT | Имя NLM-модуля (без расширения). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IMPORT | Список функций, доступных в других NLM-модулях. Может содержать имена функций и файлов со списками функций. Файл со списком обозначается как @имя_файла. Каждая строка файла должна начинаться с пробела. Перед загрузкой этого NLM-модуля должны быть загружены NLM-модули, содержащие функции, которые перечислены в списке IMPORT. Таким образом, NLM-модули могут выступать в качестве динамических библиотек. Они загружаются один раз, и все NLM-модули, запускаемые в дальнейшем, могут использовать функции, которые описаны в списке EXPORT (см. ниже) этих модулей-библиотек. В списке IMPORT следует указывать файл @CLIB.IMP, объявляющий процедуры из стандартной С-библиотеки. Если используется арифметика с плавающей точкой, то необходимо указать файл @MATHLIB.IMP. Пример: IMPORT @E:\WC386\CLIB.IMP @E:\WC386\MATHLIB.IMP | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SCREENNAME | В двойных кавычках указывается имя экрана, автоматически создаваемого при загрузке NLM-модуля. Если имя не указывается, то в качестве идентификатора экрана используется имя модуля. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
THREADNAME | Строка до 5 символов в двойных кавычках - шаблон для генерации имён новых нитей, создаваемых в загружаемом NLM-модуле. При формировании имени нити к шаблону добавляются цифры (по возрастанию, начиная с 0). Если имя не указано, то используются первые 5 символов имени модуля. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EXPORT | Список имён функций, доступных другим NLM-модулям. В списке можно использовать имя файла (@имя_файла). Каждая строка файла должна начинаться с пробела. Все NLM-модули, загружаемые в дальнейшем, могут обращаться к этим функциям в случае, если они описаны в списках IMPORT этих модулей. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MAP | Запрашивает создание MAP-файла. Если имя не указано, будет использоваться имя из директивы OUTPUT. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DEBUG | Запрашивает, чтобы компоновщик включал дополнительную информацию для отладчика. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CHECK | Указывает функцию, вызываемую перед выгрузкой NLM-модуля. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
STACK | Размер стека, выделяемого при инициализации процесса, связанного с NLM-модулем. По умолчанию - 8192 байта. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MULTIPLE | Разрешает загрузку нескольких копий NLM-модулей. Иначе при попытке загрузки более одной копии на консоль файлового сервера будет выдано сообщение об ошибке. |
В файле определений *.DEF обязательными являются ключевые слова DESCRIPTION, INPUT, OUTPUT, IMPORT.