RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Исследование модели SOM. Часть 2

PC Magazine/RE logo Об системно-объектной модели SOM, на которой основана оболочка OS/2
часть 1, часть 2, часть 3
(С) СК Пресс 5/96
PC Magazine, November 7, 1995, стр. 397
Габриель Ганьон - менеджер в области информационных технологий (г. Бостон)

---

Как заставить функции утилиты REXX работать с объектами SOM среды Workplace Shell.

В этой части обзора завершим рассмотрение иерархии классов WPS на базе модели SOM и расскажем о функциях библиотеки RexxUtil, предназначенной для совместной работы с WPS. Мы также перейдем к практическим применениям и начнем использовать объекты WPS в прикладных программах REXX.

Основные сведения о базовых классах

Базовые классы WPS, WPFileSystem, WPAbstract и WPTransient, представляют собой классы памяти (storage classes), порожденные непосредственно из WPObject. Они названы классами памяти потому, что они отличаютс способами, с помощью которых объекты WPS хранят свои свойства и данные. Характеристики хранения остальных классов WPS наследуются от одного из этих трех классов. В части 1 показана иерархия WPS-классов, начиная с WPObject.

Объекты, образованные из WPFileSystem, представляют собой дисковые файлы и каталоги. Данные и свойства этих объектов хранятся в файлах и расширенных атрибутах этих файлов. (Расширенные атрибуты содержат дополнительную информацию о файле, которую использует OS/2.) Расширенные атрибуты, используемые средой WPS - это информация о классе (CLASSINFO), типе объекта (TYPE), длинном имени объекта (LONGNAME) и ассоциированной пиктограмме (ICON). Между прочим, не все файловые и операционные системы работают с расширенными атрибутами. Например, если вы скопируете файлы OS/2 на гибкий диск и затем видоизмените их в обычной среде MS-DOS (отличающейся от версии DOS, имеющейся в составе OS/2), то потеряете расширенные атрибуты, связанные с этими файлами.

Для объектов, образованных в классе WPAbstract, информация сохраняется в файлах OS2.INI и OS2SYS.INI. Они представляют устройства, такие, как принтер и мышь, либо внутренние объекты, такие как Shadow (команда быстрого вызова) и LaunchPad (Инструментальная панель). Эти объекты не связаны непосредственно с дисковыми файлами, но им необходимо иметь возможность постоянного запоминания информации, на тот случай, если у вас возникнет желание сохранять изменения, сделанные во время сеанса работы с устройством. Состояние каждого производного объекта класса WPAbstract хранится в файле INI внутри блока, идентифицируемого дескриптором данного объекта. (Дескриптор - handle - уникальный идентификатор, присваемый каждому объекту при его создании.) Поскольку объем хранящейся в INI-файлах информации достаточно велик, настоятельно рекомендуем иметь их резервные копии на случай, если эти файлы будут испорчены - такое иногда случается, особенно если был нарушен порядок выхода из системы.

Последний базовый класс WPS - WPTransient. Классы, производные от него, не имеют постоянных хранилищ данных. Они либо не располагают свойствами, которые необходимо сохранить, либо сами организуют их временное хранение. WPMinWindow, например, выводит на экран свернутую пиктограмму, отображающую выполняемую в данный момент программу. Так как при выходе из среды OS/2 работа программы будет прекращена, то нет нужды сохранять информацию о ней. Однако, экземпляр WPJob - это временно существующий объект, созданный объектом-принтером. Он записывает на диск временный файл, и нет смысла сохранять его после завершени вывода на печать.

Теперь, когда рассмотрены основы механизма наследования WPS, вы должны иметь представление о том, откуда объекты WPS "узнают" свои характеристики и поведение. Все классы WPS, обсуждавшиеся до сих пор, являются абстрактными: они существуют исключительно с целью обеспечить наследование и не реализованы как объекты. Вам не придется непосредственно использовать в своих прикладных программах ни один из этих классов. Однако прочие классы в иерархии WPS имеют вполне конкретное содержание, так давайте обсудим некоторые способы их использования в программах REXX.

Практическое применение REXX

REXX (REstructured eXtended eXecutor - реструктурированный расширенный исполнительный язык) - интерпретируемый язык, входящий в состав OS/2. Мы решили воспользоваться им, поскольку он прост дл освоения и имеется в распоряжении всех пользователей OS/2. Кроме того, REXX был создан как макроязык дл других прикладных программ и содержит ряд специальных служебных функций WPS.

Сервисные функции WPS не встроены в язык REXX, а хранятся в библиотеке RexxUtil. Чтобы воспользоватьс ими, следует зарегистрировать функции RexxUtil в процессоре REXX. Вы можете зарегистрировать либо только те функции, которые вам нужны, либо всю библиотеку целиком. Если объем имеющейся в вашем распоряжении памяти ограничен, то вы можете загрузить лишь необходимые вам функции, так как функции WPS составляют лишь части библиотеки RexxUtil. В табл. 1 перечислены все функции WPS, имеющиеся в RexxUtil (список есть и в оперативной документации по языку REXX OS/2). После того, как функции RexxUtil будут загружены, их можно использовать во всех сеансах OS/2 до тех пор, пока вы не выгрузите их или не отключите систему.

Сервисные функции WPS, предоставляемые внешней библиотекой RexxUtil. Вы можете зарегистрировать либо необходимые функции, либо всю библиотеку.
Табл.1. Функции библиотеки RexxUtil для Workplace Shell
Имя функции Описание Синтаксис
SysCopyObject Копирует существующий
WPS-объект в новое
местоположение
rc=SysCopyObject(nameofObject,nameofDest)
SysCreateObject Создает новый
экземпляр WPS-класса
rc=SysCreateObject(classname,title,location,setup,option)
SysCreateShadow Создает команду быстрого
вызова существующего
WPS-объекта
rc=SysCreateShadow(nameofObject,nameofDest)
SysDeregisterObjectClass Удаляет определение
WPS-класса из реестра
rc=SysDeregisterObjectClass(classname)
SysDestroyObject Уничтожает WPS-объект rc=SysDestroyObject(nameofObject)
SysMoveObject Перемещает существующий WPS-объект в новое место SysMoveObject(nameofObject,nameofDest)
SysOpenObject Открывает существующий
WPS-объект
rc=SysOpenObject(nameofObject,View,Flag)
SysQueryClassList Получает список
зарегистрированных WPS-классов
SysQueryClassList stemVariable
SysRegisterObjectClass Помещает определение
WPS-класса в реестр
rc=SysRegisterObjectClass(classname,DLLname)
SysSaveObject Записывает файл OS2.INI
на диск
rc=SysSaveObject(nameofObject,fAsync)
SysSetObjectData Устанавливает значения
величин в объекте WPS
SysSetObjectData(nameofObject,setupString)
rc - код возврата

Программа REXX, регистрирующая всю библиотеку RexxUtil, приведена в лист. 1. На лист. 2 представлена программа REXX, которая регистрирует лишь индивидуальные функции WPS. Если вы не знакомы с языком REXX, но хотели бы поэкспериментировать с ним, просто введите текст программы в обычный текстовый файл и присвойте имени файла расширение CMD. Затем попытайтесь запустить его из командной строки OS/2.
---

Лист. 1. Программа для регистрации всех функций RexxUtil.
/* Зарегистрировать и загрузить все функции библиотеки RexxUtil */

call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
call SysLoadFuncs;

---
Лист. 2. Программа для регистрации всех индивидуальных функций.
/* Зарегистрировать и загрузить избранные функции библиотеки RexxUtil */

call RxFuncAdd 'SysOpenObject', 'RexxUtil', 'SysOpenObject';
call RxFuncAdd 'SysCopyObject', 'RexxUtil', 'SysCopyObject';
call RxFuncAdd 'SysMoveObject', 'RexxUtil', 'SysMoveObject';

---

Если вы получите сообщение об ошибках, то убедитесь в том, что REXX был инсталлирован, и что маршрут доступа к библиотеке указывает на библиотеки REXX - REXX.DLL, REXXAPI.DLL, REXXINIT.DLL и REXXUTIL.DLL. Кроме того, убедитесь, что в первой строке вы разместили комментарий. Все программы REXX должны начинаться с комментария, чтобы отличить их от командных файлов, которые также имеют расширение .CMD. Если файл начинается не с комментария, то OS/2 рассматривает его как командный файл и направляет в командный процессор, а не в интерпретатор REXX. Все остальные комментарии, за исключением первой строки, игнорируются. Если у вас все еще есть неясности, то сверьтесь с оперативной документацией REXX в папке Information.

Теперь, когда вы знаете, как загрузить функции RexxUtil, которые мы будем использовать в наших примерах, давайте подробнее ознакомимся с некоторыми их них. Удобно начать с SysQueryClassList. В части 1 отмечалось, что экземпляр SOMClassMgr создается при инициализации операционной среды SOM. Он отвечает за загрузку и за создание объектов, принадлежащих классам, а также за ведение реестра всех классов SOM, существующих в данной среде. SysQueryClassList запрашивает у объекта SOMClassMgr список зарегистрированных классов. В листинге программы 3 показано, как получить список и вывести его на экран. В списке приведены как имя класса, так и имя содержащей его DLL.
---

Лист.3. Программа для вывода на дисплей зарегистрированных классов SOM.
/* Запросить доступные классы и вывести их на экран */

/* Зарегистрировать функции RexxUtil */
call RxFuncAdd 'SysQueryClassList', 'RexxUtil', 'SysQueryClassList';

/* Получить доступные классы и поместить их в массив */
call SysQueryClassList 'classList.';

/* Прочитать каждый класс в списке и вывести на дисплей */
do i = 1 to classList.0
   say classList.i;
end

---
Если вы попробуете выполнить этот пример в окне OS/2, то список может оказаться слишком длинным и не уместиться на одном экране. Возможно, поэтому вы предпочтете использовать PMREXX для вывода информации в прокручиваемое окно. Для того чтобы воспользоватьс PMREXX, в ответ на командный запрос OS/2 наберите с клавиатуры "PMREXX" и через пробел укажите имя файла программы REXX, которую вы хотите выполнить.

Если нужный вам класс отсутствует в полученном списке, то вы можете загрузить его с помощью функции SysRegisterObjectClass библиотеки RexxUtil. Синтаксис этой функции таков:

   result=SysRegisterObjectClass('NewClass', 'NewClassDLL')

Замените NewClass и NewClassDLL соответственно именем класса, который вы хотите загрузить и именем файла DLL, в которой он находится. Функция передает в вызывающую программу 1 ("Истина"), если класс был успешно зарегистрирован, и 0 ("Ложь") в противном случае. Создание нового класса SOM выходит за рамки данной статьи, но если вы создадите свой собственный класс SOM, то загружать его в Workplace Shell будете именно таким способом.

После того, как вы удостоверитесь, что нужный вам класс доступен, можно использовать его для создани новых объектов. Функция SysCreateObject библиотеки RexxUtil может создавать новые объекты для замены или обновления существующих объектов. Синтаксис таков:

   result=SysCreateObject ('Classname', 'Title', 'Location', 'Setup', 'Option')

Classname должен быть классом, который в данный момент зарегистрирован в WPS. Примеры часто используемых классов - WPProgram, WPFolder и WPDataFile. Title - длинное имя, которое появляется под пиктограммой объекта на "рабочем столе".

Location - папка, в которую будет помещен объект. Этот параметр может быть задан как путь доступа файловой системы или как идентификатор объекта папки. Идентификаторы объектов уникальны для каждого объекта и имеют синтаксис <objectname>, где уникальное им объекта заключено в угловые скобки. Идентификаторы объектов, присвоенные по умолчанию, назначаются всем стандартным объектам WPS, и большинство из них начинается с символов "<WP_>". Во избежание проблем вам не следует давать новым объектам имена, принятые по умолчанию, и для верности никогда не начинайте имя с "WP".

Setup - строка необязательных параметров для задани значений переменных, которые изменяются от класса к классу. Один из параметров начальной установки, общий для всех классов - это идентификатор объекта. Можно и не назначать объекту идентификатор в момент его создания, но и невозможно программно управлять объектом, не имеющим идентификатора. Об управляющих последовательностях начальной установки мы поговорим в нашей следующей статье, а пока достаточно упомянуть, что их использование не является обязательным. Все значения этих последовательностей, заданных по умолчанию определяются классом новых объектов.

Options - код, указывающий OS/2, что делать, если объект, который вы хотите создать, уже существует. Возможны три варианта:

Этот параметр эквивалентен использованию функции RexxUtil SysSetObjectData в случае, если объект уже существует. Если объект не существует, то SysCreateObject создаст новый объект, тогда как выполнение функции SysSetObjectData завершитс неудачей.

В листинге программы 4 показано, как создать новый программный объект для редактора OS/2 Editor и поместить его на "рабочий стол".
---

Лист. 4. Программа для создания нового объекта OS/2 Editor.
/* создать на "рабочем столе" программный объект и вывести на
экран результаты */

/* загрузить функцию RexxUtil */
call RxFuncAdd 'SysCreateObject', 'RexxUtil', 'SysCreateObject';

setupString = 'OBJECTID=<RexxTestProgram>;' || 'EXENAME=\OS2\E.EXE';
rc = SysCreateObject('WPProgram', 'Rexx Test Program',,
   ',<WP_DESKTOP>', setupString );
if rc = 1 then
   say 'Program object created w/Rexx'
else say 'Could not create Program w/Rexx'

часть 1, часть 3

---
Интересные ссылки:

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2