DLL-обработчики смарт-тегов

Алексей Малинин

Интерфейсы Microsoft Smart Tags 1.0

Создание проекта ActiveX DLL

Создание распознавателя

Создание обработчика

Подключение DLL-обработчика

 

Сегодня мы познакомимся с созданием обработчиков смарт-тегов в виде ActiveX DLL (начало темы см. в статье «Смарт-теги в  Microsoft Office фирменного и кустарного приготовления», КомпьютерПресс № 11’2001). Данный вариант предоставляет существенно больше возможностей обработки «разумных меток» по сравнению с использованием XML-описаний, о которых шла речь в прошлый раз. Однако для этого требуется библиотека типов Microsoft Smart Tags 1.0 из состава Office XP. Желательно также иметь набор Smart Tag SDK 1.1, который можно свободно считать по адресу http://msdn/microsoft.com/office. В нем приведено достаточно подробное описание технологии разработки и дано несколько полезных примеров.

Интерфейсы Microsoft Smart Tags 1.0

Основная логика обработки смарт-тегов подразумевает два ключевых интерфейса: ISmartTagRecognizer  и ISmartTagAction.

ISmartTagRecognizer — это распознаватель, выделяющий из фрагмента текста смарт-теги. В связи с этим хотелось бы еще раз подчеркнуть, что смарт-тег — это некий объект документа, состоящий из фрагмента текста (который в этом случае выделяется подчеркиванием сиреневыми точками) и уникального имени его обработчика (что обеспечивает связь между смарт-тегом и его обработчиком), а также набора дополнительных свойств, заданных пользователем. Обратите внимание, что один фрагмент текста может входить в состав разных смарт-тегов. Интерфейс ISmartTagRecognizer включает несколько свойств и методов:

Desc, свойство — описание распознавателя.

Name, свойство — имя распознавателя, которое отображается в диалоговом окне «Сервис | Автозамена | Смарт-теги».

ProgID, свойство — уникальный идентификатор класса распознавателя.

Recognize, метод — процедура распознавания текста с целью выявления смарт-тегов.

SmartTagCount, свойство — число типов смарт-тегов в данном распознавателе.

SmartTagDownloadURL, свойство —  адрес Web-ресурса, используемый для выполнения команды «Проверка новых действий».

SmartTagName, свойство — набор уникальных идентификаторов для каждого типа смарт-тегов.

Интерфейс ISmartTagAction выполняет действия по обработке смарт-тега при выборе  кнопки «Действия смарт-тегов!»: сначала выдается меню с перечнем команд, а потом производится операция при выборе соответствующей позиции меню. Включает в себя следующие свойства и методы:

Desc, свойство — описание обработчика.

Name, свойство — имя обработчика, которое отображается в заголовке меню «Действия смарт-тегов».

ProgID, свойство —  уникальный идентификатор класса обработчика.

InvokeVerb, метод — процедура, выполняемая при выборе команды меню «Действия смарт-тегов».

SmartTagCount, свойство — число типов смарт-тегов, которые поддерживаются данным обработчиком.

SmartTagName, свойство —  уникальные идентификаторы для каждого типа смарт-тегов.

VerbCaptionFromID, свойство — название команды, прописываемое в меню «Действия смарт-тегов».

VerbCount, свойство — число операций обработки для данного типа смарт-тегов.

VerbID, свойство — уникальный идентификатор (используемый внутри конкретного приложения) в пределах данного обработчика для смешанной обработки смарт-тегов.

VerbNameFromID, свойство —  специальное имя для обозначения  данного вида обработки смарт-тегов.

Кроме того, библиотека Microsoft Smart Tags 1.0 включает еще два вспомогательных интерфейса, используемых при обработке смарт-тегов: ISmartTagRecognizerSite для ссылки на фрагменты документов Excel или Word, связанные с данным смарт-тегом, а также ISmartTagProperties, обеспечивающий доступ к свойствам смарт-тега.

Уже из этого описания видно, что в общем случае каждая Smart Tag DLL может влючать несколько классов интерфейса ISmartTagRecognizer и несколько классов ISmartTagAction. А может не содержать вовсе классы одного из этих интерфейсов (то есть все классы могут быть разбросаны по разным DLL). Кроме того,  каждый распознаватель и каждый обработчик (каждый класс!) могут включать несколько внутренних алгоритмов распознавания и обработки (их число в общем случае также может не совпадать). В любом случае связь между конкретными алгоритмами распознавания и обработки производится с помощью уникального идентификатора, называемого типом смарт-тега (свойство SmartTagName).

Логика работы выглядит при этом следующим образом. В момент загрузки приложения (например, Word) производится опрос всех зарегистрированных Smart Tags DLL и формируется внутренняя таблица соответствия типов смарт-тегов и классов (отдельно для распознавателей и для обработчиков). Далее по этой таблице производится вся дальнейшая работа как при распознавании, так и при выполнении действий.

Честно говоря, все это пока представляется весьма сложным, а главное непонятно, зачем применяются такие запутанные связи. Например, в данной схеме отчетливо видны потенциальные ошибки, если списки типов смарт-тегов для распознавателей и обработчиков будут различаться (в частности, из-за элементарной опечатки в тексте кода), или наоборот — в разных классах  распознавателей будут задействованы одинаковые имена типов.

Поэтому сейчас, чтобы разобраться с основными принципами разработки Smart Tag DLL, мы будем рассматривать простейший вариант, когда одна библиотека использует по одному классу распознавателя и обработчика, которые, в свою очередь, используют только один тип смарт-тега. К тому же это представляется оптимальным вариантом обработки для реальных проектов.

В начало В начало

Создание проекта ActiveX DLL

Для разработки Smart Tags DLL нам понадобится библиотека Microsoft Smart Tags 1.0 Type Library (MSTAG.TBL), входящая в состав Office XP, а также любой инструмент, поддерживающий создание ActiveX DLL, в том числе любая версия Visual Basic начиная с VB 4.0. Я буду использовать VB 6.0.

  1. Запустите среду VB, укажите режим создания нового проекта ActiveX DLL, который затем назовите MySmartTags. В окне Project | AndySimpleTest | Component должен быть установлен переключатель Project Compatibility.
  2. С помощью команды References установите ссылку на библиотеку Microsoft Smart Tags 1.0 Type Library.
  3. Имя модуля класса Class1 поменяйте на MySmartTagRecognizer и подключите к нему  соответствующий программный интерфейс, введя в окне кода в разделе объявлений Implements ISmartTagRecognizer.
  4. Создайте второй модуль класса, назовите его MySmartTagAction и подключите нужный интерфейс с помощью кода Implements ISmartTagAction.
  5. Сохраните проект.
В начало В начало

Создание распознавателя

Интерфейс ISmartTagRecognizer формируется в классе MySmartTagRecognizer.

Шаг 1. Определение  свойств ProgID, Name и Desc (в режиме «только чтение») реализуется следующим образом:

Private Property Get ISmartTagRecognizer_ProgID() As String  
  ' Имя должно совпадать с именем DLL и именем класса!  
  ISmartTagRecognizer_ProgID = _  
    "MySmartTags.MySmartTagRecognizer"  
End Property  
   
Private Property Get ISmartTagRecognizer_Name  _  
   (ByVal LocaleID As Long) As String  
    ISmartTagRecognizer_Name = _  
      "Мой распознаватель"  
End Property  
   
Private Property Get ISmartTagRecognizer_Desc _  
   (ByVal LocaleID As Long) As String  
  ISmartTagRecognizer_Desc = _  
   "Это DLL-распознаватель смарт-тегов"  
End Property  

Как видно, мы могли учитывать при формировании свойств Name и Desc региональные установки конкретного компьютера, например, для формирования строковых свойств на русском или английском языке.

Шаг 2. Создадим код для свойств SmartTagCount, SmartTagName и SmartTagDownLoadURL:

Private Property Get   
  ISmartTagRecognizer_SmartTagCount()  As Long  
  ISmartTagRecognizer_SmartTagCount = 1  
End Property  
   
Private Property Get _  
  ISmartTagRecognizer_SmartTagName _  
   (ByVal SmartTagID As Long) As String  
  ISmartTagRecognizer_SmartTagName = _  
   "My-UniqueID-Smart-Tags#MySmartTag"  
End Property  
   
Private Property Get _  
  ISmartTagRecognizer_SmartTagDownloadURL _  
   (ByVal SmartTagID As Long) As String  
  ISmartTagRecognizer_SmartTagDownloadURL = Null  
End Property  

В этих процедурах используется аргумент SmartTagID, который соответствует порядковому номеру типа смарт-тега в данном обработчике и может изменяться от 1 до SmartTagCount.

Шаг 3. Формируем список искомых терминов:

Dim MyWords$(1 To 4)  
   
Private Sub Class_Initialize()  
  ' Формирование списка терминов  
  MyWords(1) = "Word"  
  MyWords(2) = "Excel"  
  MyWords(3) = "Access"  
End Sub  

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

Шаг 4. Метод Recognize — это ключевая процедура данного класса:

Private Sub _  
  ISmartTagRecognizer_Recognize _  
  (ByVal Text As String, _  
  ByVal DataType As SmartTagLib.IF_TYPE, _  
  ByVal LocaleID As Long, _  
  ByVal RecognizerSite As _  
  SmartTagLib.ISmartTagRecognizerSite)  
  '  
  ' Text — фрагмент текста  
  ' DataType — тип режима распознавания (не используем сейчас)  
    
  Dim i As Integer, index As Integer  
  Dim iWordlen As Integer, MyWord  
  Dim propbag As _  
    SmartTagLib.ISmartTagProperties  
  ' Контекстный поиск заданных терминов  
  For i = LBound(MyWords) To UBound(MyWords)  
    MyWord = MyWords(i)  
    iWordlen = Len(MyWord)  
    index = InStr(Text, MyWord)    
    While index > 0 ' найдено слово  
      ' установка смарт-тега  
      ' Запрашиваем у RecognizerSite   
      'объект для хранения свойств  
      Set propbag = _   
        RecognizerSite.GetNewPropertyBag  
      ' подключаем смарт-тег к приложению  
      RecognizerSite.CommitSmartTag _  
        "My-UniqueID-Smart-Tags#MySmartTag", _  
        index, iWord, propbag  
      ' продолжаем поиск  
      index = InStr(index + iWordlen, _  
        Text, MyWord)  
    Wend  
  Next i  
   

В этом коде используется объект RecognizerSite, выполняющий соответствующие действия по внедрению смарт-тега в документ.

В начало В начало

Создание обработчика

Шаг 1. Сформируем код для определения свойств ProgID, Name и Desc:

Private Property Get _  
  ISmartTagAction_ProgId() As String  
    ISmartTagAction_ProgId = _  
      "MySmartTags.MySmartTagAction"  
End Property  
   
Private Property Get _  
  ISmartTagAction_Name _  
  (ByVal LocaleID As Long) As String  
   ISmartTagRecognizer_Name = _  
      "Мой обработчик"  
End Property  
   
Private Property Get _   
   ISmartTagAction_Desc _  
   (ByVal LocaleID As Long) As String  
  ISmartTagAction_Desc = _  
    "Это DLL-обработчик смарт-тегов"  
End Property  

Шаг 2. Сформируем код для свойств SmartTagCount, SmartTagName и SmartTagCaption:

Private Property Get _  
  ISmartTagAction_SmartTagCount() As Long  
  ISmartTagAction_SmartTagCount = 1  
End Property  
   
Private Property Get _  
  ISmartTagAction_SmartTagName _  
   (ByVal SmartTagID As Long) As String  
   ISmartTagRecognizer_SmartTagName = _  
     "My-UniqueID-Smart-Tags#MySmartTag"  
End Property  
   
Private Property Get _  
  ISmartTagAction_SmartTagCaption _  
   (ByVal SmartTagID As Long, _  
   ByVal LocaleID As Long) As String  
   ' Текст, который появится в заголовке меню:  
   ISmartTagAction_SmartTagCaption = _  
      "DLL-обработка терминов"  
End Property  

Шаг 3. Для связки типа смарт-тега и набора предлагаемых действий по их обработке необходимо сформировать свойства VerbCount, VerbID, VerbCaptionFromID и VerbNameFromID. Сейчас мы напишем достаточно простой код, имея в виду, что у нас в этой DLL применяется только один тип смарт-тегов.

Private Property Get _  
  ISmartTagAction_VerbCount _  
   (ByVal SmartTagName As String) As Long  
  ' Количество действий, используемых   
  ' для данного типа смарт-тега  
  If SmartTagName = _  
    "My-UniqueID-Smart-Tags#MySmartTag" then   
    ISmartTagAction_VerbCount = 4  
End Property  
   
Private Property Get _  
   ISmartTagAction_VerbID _  
    (ByVal SmartTagName As String, _  
    ByVal VerbIndex As Long) As Long  
  ISmartTagAction_VerbID = VerbIndex   
End Property  
   
Private Property Get _  
   ISmartTagAction_VerbCaptionFromID _  
   (ByVal VerbID As Long, _  
   ByVal ApplicationName As String, _  
   ByVal LocaleID As Long) As String  
     
  ' Названия команд для   
  ' меню "Действие смарт-тегов"  
  Select Case VerbID  
   Case 1  
    ISmartTagAction_VerbCaptionFromID = "MS Word"  
   Case 2  
    ISmartTagAction_VerbCaptionFromID = "MS Excel"  
   Case 3  
    ISmartTagAction_VerbCaptionFromID = "MS Access"  
   Case 4  
    ISmartTagAction_VerbCaptionFromID = "MS Office"  
  End Select  
End Property  
   
Private Property Get _  
  ISmartTagAction_VerbNameFromID _  
  (ByVal VerbID As Long) As String  
  Select Case VerbID  
    Case 1  
    ISmartTagAction_VerbNameFromID = "MSWord"  
   Case 2  
    ISmartTagAction_VerbNameFromID = "MSExcel"  
   Case 3  
    ISmartTagAction_VerbNameFromID = "MSAccess"  
   Case 4  
    ISmartTagAction_VerbNameFromID = "MSOffice"  
  End Select  
End Property  

Шаг 4. Метод InvokeVerb выполняет операции при выборе соответствующей команды меню «Действия смарт-тегов».

Private Sub ISmartTagAction_InvokeVerb _  
  (ByVal VerbID As Long, _  
   ByVal ApplicationName As String, _  
   ByVal Target As Object, _  
   ByVal Properties As SmartTagLib.ISmartTagProperties, _  
   ByVal Text As String, _  
   ByVal Xml As String)  
     
   Dim ie As Object  
   Set ie = CreateObject _  
    ("InternetExplorer.Application")  
   With ie  
     Select Case VerbID  
      Case 1  
        .Navigate2 "www.microsoft.com/word"  
      Case 2  
        .Navigate2 "www.microsoft.com/excel"  
      Case 3  
        .Navigate2 "www.microsoft.com/access"  
      Case 4  
        .Navigate2 "www.microsoft.com/office"  
     End Select  
    .Visible = True  
   End With  
End Sub  
В начало В начало

Подключение DLL-обработчика

Для создания ActiveX DLL выберите команду «File | Make».

Регистрация обработчика смарт-тегов выполняется в два этапа. Во-первых, библиотеку нужно зарегистрировать в качестве ActiveX-сервера с помощью утилиты Regsvr32.exe: Regsvr32.exe AndySimpleTest.DLL

(при компиляции библиотеки ее регистрация на данном компьютере выполняется автоматически).

Далее все созданные нами классы — распознавателя и исполнителя действий —  нужно прописать еще в системный реестр с помощью утилиты Regedit.exe. Для этого

откройте раздел «HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag», который содержит две папки: Recognizers и Actions. В каждой из них создайте по одному новому ключу, в которые введите полные идентификаторы ProgID двух созданных нами классов: MySmartTags.MySmartTagRecognizer и MySmartTag.MySmartTagAction соответственно.

А теперь загрузите Word 2002 и посмотрите, как работает наш DLL-обработчик смарт-тегов.

Откройте окно «Сервис | Автозамена | Смарт-теги» и убедитесь, что в списке «Распознаватели» появилась строка «Мой распознаватель». Теперь введите в документе одно из заданных нами ключевых слов, например «Access», и удостоверьтесь, что оно распознается в качестве смарт-тега и обрабатывается в заданных нами режимах.

Будем считать, что мы освоили азы разработки Smart Tags DLL, опустив некоторые нюансы. Теперь можно переходить к разработке реальных проектов...

КомпьютерПресс 12'2001