Общее описание

Основные дополнения к языку JavaScript, сделанные корпорацией Microsoft, связаны с использованием управляющих элементов ActiveX. Эти элементы представляют собой динамические библиотеки, созданные в соответствии со стандартом COM. COM (Component Object Model) — это стандарт создания программных компонентов, рассмотрение которого выходит за рамки нашего справочника. Для наших целей вполне достаточно воспринимать элементы ActiveX как черный ящик, выполняющий определенные действия по запросу вызвавшей его программы. Появление элементов ActiveX было порождено стремлением Microsoft создать технологию, которая могла бы успешно конкурировать с подключаемыми модулями обозревателей Netscape. Следует признать, что задача была решена исключительно удачно, т. к. в результате появился стандарт разработки платформо-зависимых программных компонентов, реализующих платформо-независимые протоколы и архитектуры. Все элементы ActiveX при установке в системе Windows регистрируются в ее регистре. При этом в качестве уникального ключа используется GUID данного элемента, т. е. его уникальный 64-разрядный шестнадцатеричный номер. Для доступа к элементу ActiveX по его GUID в HTML-документе используется элемент OBJECT, например:
<OBJECT style="left: 0px; top: 0px"
  classid="clsid:8E27C92B-1264-101C-8A2F-040224009C02">
    <PARAM NAME="_Version" VALUE="524288">
    <PARAM NAME="_ExtentX" VALUE="7620">
    <PARAM NAME="_ExtentY" VALUE="5080">
    <PARAM NAME="_StockProps" VALUE="1">
    <PARAM NAME="BackColor" VALUE="-2147483633">
    <PARAM NAME="Year" VALUE="2000">
    <PARAM NAME="Month" VALUE="10">
    <PARAM NAME="Day" VALUE="22">
    <PARAM NAME="DayLength" VALUE="1">
    <PARAM NAME="MonthLength" VALUE="2">
    <PARAM NAME="DayFontColor" VALUE="0">
    <PARAM NAME="FirstDay" VALUE="2">
    <PARAM NAME="GridCellEffect" VALUE="1">
    <PARAM NAME="GridFontColor" VALUE="10485760">
    <PARAM NAME="GridLinesColor" VALUE="-2147483632">
    <PARAM NAME="ShowDateSelectors" VALUE="-1">
    <PARAM NAME="ShowDays" VALUE="-1">
    <PARAM NAME="ShowHorizontalGrid" VALUE="-1">
    <PARAM NAME="ShowTitle" VALUE="-1">
    <PARAM NAME="ShowVerticalGrid" VALUE="-1">
    <PARAM NAME="TitleFontColor" VALUE="10485760">
    <PARAM NAME="ValueIsNull" VALUE="0">
</OBJECT>
Этот фрагмент HTML-документа содержит управляющий элемент ActiveX "Календарь" и будет отображаться обозревателем примерно так: Отображение элемента Календарь Исполняющая система JScript дает нам более гибкие возможности запуска элементов ActiveX, которые описаны ниже.

Объект ActiveXObject

Объект ActiveXObject используется для запуска объектов ActiveX. Он создается конструктором
new ActiveXObject("сервер.класс" [,"адрес"?])
Здесь сервер — имя COM-сервера, класс — имя класса создаваемого объекта, адрес — необязательное имя сетевого сервера, на котором должен быть создан заданный объект (может быть доменным именем или IP-адресом). Создание объекта на удаленном сервере действующими версиями JScirpt пока не поддерживается, т. е. аргумент адрес при вызове данного конструктора игнорируется. После создания объекта ActiveX (т. е. после запуска соответствующей программы) мы можем обращаться к его методам и свойствам, используя стандартный синтаксис языка JavaScript. Встроенных свойств и методов этот объект не имеет. Пример: если на компьютере-клиенте установлен Microsoft Word 7.0, то следующий сценарий его запустит, откроет документ Mydoc.doc, сохранит этот документ в текстовом формате и завершит работу MS Word.
var word = new ActiveXObject("Word.Application"); // запускает MS Word
word.Documents.Open("Mydoc.doc");		  // открывает документ
word.ActiveDocument.SaveAs("Mydoc.txt", 4);	  // 4 = текстовый формат DOS
word.Quit();					  // завершает работу MS Word
Примечания.
  1. Следует помнить, что после запуска объекта ActiveX он остается активным до закрытия окна обозревателя, из которого он был вызван. JScript не содержит стандартного средства для завершения работы этого объекта. Если мы хотим, чтобы объект прекратил работу ранее завершения работы нашего сценария, то должны вызвать соответствующий метод данного объекта (в приведенном примере это метод Quit).
  2. Любопытно, что операция typeof возвращает для свойств и методов объектов ActiveX нестандартное значение "unknown" (видимо из-за того, что все объекты ActiveX являются наследниками COM-интерфейса IUnknown).

Функция GetObject

Функция GetObject возвращает ссылку на COM-объект, содержащийся в заданном файле. Она имеет вид
GetObject(["имя_файла"][,"сервер.класс"?])
Здесь имя_файла — спецификация файла, сервер — имя COM-сервера, класс — имя класса объектов. Если имя_файла опущено, то задание второго аргумента обязательно, в противном случае оно может быть опущено. При вызове этой функции запускается приложение, ассоциированное с заданной спецификацией файла (перечень таких ассоциаций хранится в системном регистре Windows). Если имя_файла — это пустая строка "", то создается новый экземпляр объекта заданного типа. Если имя_файла опущено, то возвращается ссылка на объект данного типа, который активен в данный момент. Если такого объекта нет, то генерируется ошибка. Некоторые приложения позволяют нам активировать часть файла. Для этого следует добавить восклицательный знак (!) к имени файла и после него задать строку, указывающую на ту часть файла, которую мы хотим активировать. О том, как задавать эту строку, см. документацию к программе, с помощью которой создан данный файл. Так, например, программа автоматизации проектирования может хранить в файле чертежей несколько слоев. Для активации второго слоя в файле чертежа с именем MyCad.cad мы можем использовать строку
var layerObj = GetObject("MyCad.cad!Layer2");
Если мы не укажем класс объекта, то приложение, активирующее данный файл, определяется из системного регистра. Однако, некоторые файлы могут поддерживать несколько типов объектов. В этом случае следует явно указывать второй аргумент данной функции, например:
var myObj = GetObject("SAMPLE.DRW", "FIGMENT.DRAWING");
В этом примере FIGMENT — имя программы, а DRAWING — один из классов объектов, которые она поддерживает. После активации объекта мы можем обращаться к его методам и свойствам, используя стандартный синтаксис языка JavaScript. Встроенных свойств и методов этот объект не имеет. Функцией GetObject следует пользоваться в тех случаях, когда приложение, создающее экземпляры объектов данного класса, уже активно или когда мы хотим не только запустить приложение, но и загрузить в него файл, содержащий нужный нам объект. В остальных случаях используйте объект ActiveXObject. Если объект зарегистрирован как существующий в единственном экземпляре (например Word.Basic в Microsoft Word 7.0), то GetObject всегда возвращает ссылку на этот единственный экземпляр объекта, будучи вызвана с пустой строкой в качестве имени файла, и генерирует ошибку, если имя_файла опущено. Примечание. Приведенное описание функции GetObject и примеры ее использования позаимствованы из документации Microsoft. Дело в том, что автор не смог найти ни одного разумного применения этой функции в клиентской среде. Более того, по сообщению разработчиков, в обозревателях Interent Explorer ее применение запрещено "в целях безопасности"