Smart-Tag-Programmierung

24.08.2001 von THOMAS RIESKE 
Eine der auffälligsten Neuerungen, die Microsoft mit Office XP eingeführt hat, sind die Smart Tags. Mit dem richtigen Know-how lassen sich diese intelligenten Helfer an eigene Bedürfnisse anpassen.

Microsoft verspricht ein besseres und produktiveres Arbeiten mit Smart Tags. Sie ermöglichen die Verknüpfung zu unterschiedlichen Informationsquellen, etwa anderen Office-Applikationen oder Internet-Inhalten. Smart Tags werkeln in Word, Excel und eingeschränkt auch in Outlook und Powerpoint. Nützlich sind sie etwa bei Autokorrekturen oder Formatzuweisungen. So gibt es durchaus gute Gründe, nach einem Punkt klein weiterzuschreiben - beispielsweise bei Abkürzungen. Da Word einen Punkt aber in der Regel als Signal für das Satzende interpretiert, erzwingt es im Anschluss an das Satzzeichen einen Großbuchstaben. Diese eigenmächtigen Eingriffe lassen sich nun mit Hilfe von Smart Tags unterbinden.

Aber Smart Tags können mehr. Anhand einer mitgeführten Wortliste versehen sie bestimmte Inhalte eines Dokuments mit einem Kurzmenü. Wird etwa ein in Word eingegebener Personenname als bekannt identifiziert, lässt er sich mit wenigen Mausklicks zu den Outlook-Kontakten hinzufügen. Das Versenden einer E-Mail ist auf die gleiche Weise möglich.

Wer sich mit den in Office XP enthaltenen Smart Tags nicht zufrieden gibt, kann auch Lösungen erstellen, die an die eigenen Bedürfnisse angepasst sind. Wir zeigen, welche Hilfsmittel Microsoft zur Verfügung stellt und welche Aufgaben sich damit bewältigen lassen. (tri)

Sicherheitsfragen

Bei allen hilfreichen Optionen, die Smart Tags bieten, bleibt die Frage: Wie steht es mit der Sicherheit? Schließlich kann niemand im Voraus erkennen, was genau sich hinter einem interessant klingenden Menüpunkt verbirgt. Und die Vorfälle um virenverseuchte E-Mail-Anhänge lassen wenig Hoffnung aufkommen, dass die User ausgerechnet bei Smart Tags geschicktem Social Engineering widerstehen.

Eine gewisse Kontrolle über Smart Tags erlaubt Microsoft dem Anwender mit den gleichen Mechanismen, die auch für Makros gelten. Die in Extras/Makro/Sicherheit getroffenen Einstellungen entscheiden also darüber, wie Smart Tags behandelt werden. Die Standardeinstellung ("Allen installierten Add-ins und Vorlagen vertrauen"), lässt allerdings jeden Smart Tag zu, unabhängig von der gewählten Sicherheitsstufe. Die Auswirkungen der möglichen Kombinationen zeigt die nachfolgende Tabelle:

Smart-Tag-Sicherheitseinstellungen

Allen installierten Vorlagen und Add-ins vertrauen

Sicherheits- stufe

Smart Tag ist digital signiert

Aus ver- trauens- würdiger Quelle

Auswirkung

Aktiviert

hoch/ mittel/ niedrig

ja/ nein

ja/ nein

Smart Tag wird geladen

Deaktiviert

hoch

ja

ja

Smart Tag wird geladen

Deaktiviert

hoch

ja

nein

Aufforderung

Deaktiviert

hoch

nein

---

Smart Tag wird nicht geladen

Deaktiviert

mittel

ja

ja

Smart Tag wird geladen

Deaktiviert

mittel

ja

nein

Aufforderung

Deaktiviert

mittel

nein

---

Aufforderung

Deaktiviert

niedrig

ja/nein

ja/nein

Smart Tag wird geladen

Weitere Sicherheitsbedenken richten sich gegen verräterische Spuren, die Smart Tags im Dokument hinterlassen. Es handelt sich hierbei um XML-Daten, die mitgesichert werden, wenn man das Einbetten von Smart Tags aktiviert hat. In den Speicheroptionen der Office-Anwendungen lässt sich dieses Verhalten jedoch deaktivieren.

Smart-Tag-Listen

Die einfachste Möglichkeit, eigene Smart Tags zu erstellen, führt über Smart-Tag-Listen. Diese liegen als XML-Dateien vor, so dass zum Erstellen ein Texteditor wie Notepad ausreicht. Komfortabler gelingt das jedoch mit dem Microsoft Office Smart Tag List Tool (MOSTL), das in den Advanced Smart Tag Tools enthalten ist.

Dahinter verbirgt sich die Excel-Vorlage SmartTagMOSTLGenerator.xlt, in die man alle relevanten Informationen eingibt. Kommentare liefern eine kurze Erläuterung zu Smart-Tag-Eigenschaften, Wortliste sowie möglichen Aktionen. Definiert man als Aktion eine URL, kann man an diese sogar Parameter übergeben. Dabei enthält die Variable {TEXT} den als Smart-Tag-fähig erkannten Begriff.

Diese Möglichkeit wollen wir in einem Beispiel nutzen und die Suchmaschine auf tecChannel.de mit verschiedenen Begriffen füttern.

Smart-Tag-Listen: Beispiel

Für unser Beispiel ändern wir zunächst in MOSTL die Exporteinstellungen auf C:\\Programme\\Gemeinsame Dateien\\Microsoft Shared\\Smart Tag\\Lists. Dann belegen wir die in MOSTL vorgegebenen Smart-Tag-Eigenschaften wie Kurzbeschreibung und Sprach-ID mit Werten. Die Wortliste füllen wir mit einigen Begriffen aus dem Bereich der Viren und Würmer.

Den Termini ordnen wir vier mögliche Aktionen zu: Entweder werden auf tecChannel.de alle News auf diese Begriffe durchsucht oder alle Artikel in der Rubrik Software respektive Internet. Schließlich soll man auch noch über alle Rubriken suchen können. Die URL, in der wir unsere Suchanfrage unterbringen, lautet

http://62.96.227.81/tecchannel/setsearch.php?query=""&rubrik=""

Nach query= soll der als Smart-Tag-fähig markierte Begriff, etwa Virus, folgen. Die Variable {TEXT}hilft hier weiter. Als Rubriken sind möglich: news, software, internet sowie ein Leer-String für die Suche über den gesamten tecChannel.

Abschließend generiert MOSTL per Mausklick aus diesen Daten das Smart Tag. Der kleine Helfer markiert von nun an jedes Wort aus der Liste und bietet unsere definierten Aktionen an.

Smart-Tag-Listen: Beispiel-XML-Code

Da die Listen als reine XML-Dateien vorliegen, reicht zur Eingabe ein simpler Texteditor. Nachfolgend finden Sie den Code, den wir in unserem Beispiel verwenden. Den kompletten XML-Code können Sie hier downloaden. Damit das Smart Tag geladen wird, aktivieren Sie unter Extras/Autokorrektur/Smarttags/ den Eintrag Smarttaglisten.

<?xml version="1.0" encoding="UTF-16"?>
<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-com:smarttags:list">
<FL:name>tecchannel SmartTag</FL:name>
<FL:lcid>0</FL:lcid>
<FL:description>tecchannel-Artikelsuche</FL:description>
<FL:moreinfourl>http://</FL:moreinfourl>
<FL:smarttag type="urn:schemas-smarttaglistgenerator:excel #tecchannel_artikel">
<FL:caption>tecchannel-Artikelsuche</FL:caption>
<FL:terms><FL:termlist>Virus, Viren, Wurm, Würmer, Trojaner, Trojanisches Pferd, ILOVEYOU, Melissa, Malware, Backdoor</FL:termlist></FL:terms>

<FL:actions>
<FL:action id="tecchannel_news">
<FL:caption>News mit diesem Begriff auf tecChannel suchen</FL:caption>
<FL:url>
http://62.96.227.81/tecchannel/ setsearch.php?query={TEXT}&amp;rubrik=news
</FL:url>
</FL:action>

<FL:action id="tecchannel_sw">
<FL:caption>Artikel mit diesem Begriff in der Rubrik Software auf tecChannel suchen</FL:caption>
<FL:url>
http://62.96.227.81/tecchannel/ setsearch.php?query={TEXT}&amp;rubrik=software
</FL:url>
</FL:action>

<FL:action id="tecchannel_internet">
<FL:caption>Artikel mit diesem Begriff in der Rubrik Internet auf tecChannel suchen</FL:caption>
<FL:url>
http://62.96.227.81/tecchannel/ setsearch.php?query={TEXT}&amp;rubrik=internet
</FL:url>
</FL:action>

<FL:action id="tecchannel_all">
<FL:caption>Artikel mit diesem Begriff in allen Rubriken auf tecChannel suchen</FL:caption>
<FL:url>
http://62.96.227.81/tecchannel/ setsearch.php?query={TEXT}&amp;rubrik=
</FL:url>
</FL:action>
</FL:actions>
</FL:smarttag>
</FL:smarttaglist>

Smart-Tag-DLLs

Smart-Tag-DLLs sind flexibler als Listen, aber auch komplizierter zu entwickeln. Das in Microsoft-Office integrierte VBA reicht nicht aus. Wer allerdings mit dieser Makrosprache bereits einige Erfahrung besitzt, für den bietet sich Visual Basic an. Im Smart Tag Development Kit findet man aber auch ein Beispiel in Visual C++.

Office XP stellt die Smart Tags 1.0 Type Library zur Verfügung. Diese Bibliothek besteht aus einer Reihe von Eigenschaften und Methoden, die in zwei Schnittstellen zusammengefasst sind: ISmartTagRecognizer erkennt Zeichenketten als Smart-Tag-fähig; ISmartTagAction zeigt die Liste der möglichen Aktionen an und führt die jeweils gewählte aus.

ISmartTagRecognizer und ISmartTagAction

Zusammen stellen die beiden Module 18 Eigenschaften und Methoden zur Verfügung, die wir nachfolgend zusammengefasst haben:

ISmartTagRecognizer

Name der Eigenschaft oder Methode

Beschreibung

Desc

Beschreibung des Smart-Tag-Recognizer

Name

Name des Smart-Tag-Recognizer

ProgID

Unique Identifier

Recognize

Die Methode, die Zeichenketten als Smart-Tag-fähig erkennt

SmartTagCount

Anzahl der Smart-Tag-Typen, die erkannt werden

SmartTagDownloadURL

Die URL, die sich hinter Extras/Autokorrektur/Smart Tags/Weitere Smart Tags verbirgt

SmartTagName

Unique Identifier für Smart-Tag-Typen, die dieser Recognizer erkennt

ISmartTagAction

Name der Eigenschaft oder Methode

Beschreibung

Desc

Beschreibung der Smart-Tag-Aktion

InvokeVerb

Die über das Smart-Tag-Action-Menü ausgelöste Aktion

Name

Name der Aktion

ProgID

Unique Identifier des Klassenmoduls

SmartTagCaption

Überschrift des Smart-Tag-Action-Menüs

SmartTagCount

Anzahl der Smart-Tag-Typen, die erkannt werden

SmartTagName

Die verschiedenen Arten der Smart-Tag-Aktionen

VerbCaptionFromID

Die Überschriften der Aktionen im Smart-Tag-Action-Menü

VerbCount

Die Anzahl der von einem bestimmten Smart-Tag-Typ unterstützten Aktionen

VerbID

Diese Eigenschaft gibt eine eindeutige ID innerhalb des Smart Tag zurück

VerbNameFromID

Diese Eigenschaft gibt einen Namen zurück, der die Smart-Tag-Aktion repräsentiert

Beispiel-DLL: Vorgaben

Wir wollen in Visual Basic eine Smart-Tag-DLL realisieren, die in einem Dokument nach den Namen der einzelnen Office-Applikationen sucht. Der Anwender soll die Möglichkeit haben, über das Smart-Tag-Menü Informationen über bereits dokumentierte Bugs zu der jeweiligen Anwendung auf search.microsoft.com abzufragen. Zu diesem Zweck belegen wir die Suchmaske auf der Microsoft-Seite mit dem Applikationsnamen sowie kbbug (=Knowledgebase Bug) vor.

Zunächst deklarieren wir unsere Wortliste im Modul ISmartTagRecognizer. Dann weisen wir den Eigenschaften von ISmartTagRecognizer und ISmartTagAction Werte zu. Die Prog_ID sollte man sich gut merken: Später beim Registrieren der DLL wird sie wichtig.

Die eigentliche Arbeit, das Erkennen des eingegebenen Texts, übernimmt die Methode Recognize. Eine Schleife analysiert, ob sich in den eingelesenen Zeichen die Begriffe Word, Excel, Access, Frontpage, Outlook oder Powerpoint befinden.

Beispiel-DLL: Aktionen

In ISmartTagAction stecken die zu den definierten Begriffen passenden Aktionen. Die Methode InvokeVerb bestimmt, was beim Anklicken eines bestimmten Smart-Tag-Menüpunkts geschieht. Gemäß unserer Wortliste unterscheiden wir sechs Fälle und rufen die URL search.microsoft.com mit den oben angeführten Abfragewerten auf.

Nach dem Kompilieren des VB-Projekts kopieren wir die erstellte Smart-Tag-DLL in den Ordner C:\\Programme\\Gemeinsame Dateien\\Microsoft Shared\\Smart Tag. Bevor es ans Testen gehen kann, müssen wir die DLL erst noch registrieren. Die folgenden Registry-Zweige nehmen die Prog_ID als leere Unterschlüssel auf:

HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\ Common\\Smart Tag\\Recognizers\

und

HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\ Common\\Smart Tag\\Action

Klappt nicht alles so wie geplant, hilft vielleicht ein Blick in Microsofts Smart-Tags-FAQ. In dieser Übersicht finden sich die häufigsten Fehlerursachen.

Beispiel-DLL: ISmartTagRecognizer-Quelltext

Den Quelltext dieser Klasse können Sie hier downloaden.

Option Explicit

Implements ISmartTagRecognizer

Dim terms(6) As String
Dim numTerms As Integer

Private Sub Class_Initialize()

terms(1) = "word"
terms(2) = "excel"
terms(3) = "access"
terms(4) = "frontpage"
terms(5) = "outlook"
terms(6) = "powerpoint"

numTerms = 6
End Sub

Private Property Get ISmartTagRecognizer_ProgId() As String

ISmartTagRecognizer_ProgId = "MSKB.SmartTagRecognizer"
End Property

Private Property Get ISmartTagRecognizer_Name(ByVal LocaleID As Long) As String

ISmartTagRecognizer_Name = "MS-Knowledgebase-Suche"
End Property

Private Property Get ISmartTagRecognizer_Desc(ByVal LocaleID As Long) As String
ISmartTagRecognizer_Desc = "MS-Knowledgebase-Suche nach Office-Begriffen"
End Property

Private Property Get ISmartTagRecognizer_SmartTagCount() As Long
ISmartTagRecognizer_SmartTagCount = 1
End Property

Private Property Get ISmartTagRecognizer_SmartTagName(ByVal SmartTagID As Long) As String

If (SmartTagID = 1) Then
ISmartTagRecognizer_SmartTagName = "ms-kb#kbsuche"
End If
End Property

Private Property Get ISmartTagRecognizer_SmartTagDownloadURL(ByVal SmartTagID As Long) As String

ISmartTagRecognizer_SmartTagDownloadURL = ""
End Property

Public Sub ISmartTagRecognizer_Recognize(ByVal Text As String, ByVal DataType As SmartTagLib.IF_TYPE, ByVal LocaleID As Long, ByVal RecognizerSite As SmartTagLib.ISmartTagRecognizerSite)
Dim intLoop As Integer
Dim intindex As Integer
Dim intTermLen As Integer
Dim stlpropbag As SmartTagLib.ISmartTagProperties
Text = LCase(Text)
For intLoop = 1 To numTerms
intindex = InStr(Text, terms(intLoop))
intTermLen = Len(terms(intLoop))
Do While intindex > 0
Set stlpropbag = RecognizerSite.GetNewPropertyBag

RecognizerSite.CommitSmartTag "ms-kb#kbsuche", intindex, intTermLen, stlpropbag

intindex = InStr(intindex + intTermLen, Text, terms(intLoop))
Loop
Next intLoop
End Sub

Beispiel-DLL: ISmartTagAction-Quelltext

Den Quelltext dieser Klasse können Sie hier downloaden.

Option Explicit

Implements ISmartTagAction

Private Property Get ISmartTagAction_ProgId() As String

ISmartTagAction_ProgId = "MSKB.SmartTagAction"
End Property

Private Property Get ISmartTagAction_Name(ByVal LocaleID As Long) As String

ISmartTagAction_Name = "MS-KB-Abfragen"
End Property

Private Property Get ISmartTagAction_Desc(ByVal LocaleID As Long) As String

ISmartTagAction_Desc = "MS-Knowledgebase-Suche nach Office-Begriffen"
End Property

Private Property Get ISmartTagAction_SmartTagCount() As Long

ISmartTagAction_SmartTagCount = 1
End Property

Private Property Get ISmartTagAction_SmartTagName(ByVal SmartTagID As Long) As String

If (SmartTagID = 1) Then
ISmartTagAction_SmartTagName = "ms-kb#kbsuche"
End If
End Property

Private Property Get ISmartTagAction_SmartTagCaption(ByVal SmartTagID As Long, ByVal LocaleID As Long) As String

ISmartTagAction_SmartTagCaption = "In der MS-Knowledgebase aufgeführte Office-XP-Bugs"
End Property

Private Property Get ISmartTagAction_VerbCount(ByVal SmartTagName As String) As Long

If (SmartTagName = "ms-kb#kbsuche") Then
ISmartTagAction_VerbCount = 6
End If
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 Frontpage"

Case 5
ISmartTagAction_VerbCaptionFromID = "MS Outlook"

Case 6
ISmartTagAction_VerbCaptionFromID = "MS Powerpoint"
End Select
End Property

Private Property Get ISmartTagAction_VerbNameFromID(ByVal VerbID As Long) As String

Select Case VerbID

Case 1
ISmartTagAction_VerbNameFromID = "MS Word"
Case 2
ISmartTagAction_VerbNameFromID = "MS Excel"
Case 3
ISmartTagAction_VerbNameFromID = "MS Access"
Case 4
ISmartTagAction_VerbNameFromID = "MS Frontpage"
Case 5
ISmartTagAction_VerbNameFromID = "MS Outlook"
Case 6
ISmartTagAction_VerbNameFromID = "MS Powerpoint"

End Select

End Property


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 Variant
Set ie = CreateObject("InternetExplorer.Application")

With ie
Select Case VerbID
Case 1
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Word 2002"" kbbug"

Case 2
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Excel 2002"" kbbug"

Case 3
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Access 2002"" kbbug"

Case 4
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Frontpage 2002"" kbbug"

Case 5
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Outlook 2002"" kbbug"

Case 6
.Navigate2 "http://search.microsoft.com/us/dev/default.asp?qu=""Powerpoint 2002"" kbbug"

End Select

.Visible = True
End With

End Sub