スマート タグ DLL の開発

Paul Cornell
Microsoft Corporation

April 2001

対象 :
   MicrosoftR Office XP

この記事は、Microsoft Visual BasicR、コンポーネント オブジェクト モデル (COM)、およびダイナミック リンク ライブラリ (DLL) に精通している読者を対象にしています。

概要 : Visual Basic および Microsoft Smart Tags 1.0 タイプ ライブラリを使用して、Office XP 用のスマート タグ DLL を作成、テスト、および配置する方法を説明します。

MSDN Online Code Center (英語) で ODC_SmartTags.exe サンプル コードを参照してください。

目次

はじめに
スマート タグ インターフェイスの調査
初歩のスマート タグ DLL の開発
   DLL プロジェクトの作成
   ISmartTagRecognizer インターフェイスの実装
   ISmartTagAction インターフェイスの実装
スマート タグ DLL のコンパイルと登録
スマート タグ DLL のテスト
まとめ

はじめに

あらゆるテキスト ベースの伝達には文字、数字、および記号が含まれますが、 伝達の実際の能力はこのコンテキスト (文脈、意味情報) にあります。 たとえば、新聞記事で "MSFT" という文字を見つけた場合、 おそらく皆さんはこれは Microsoft Corporation の株式銘柄コードであると認識するでしょう。 これは、皆さんが株式銘柄コードとは何であるかという知識を持っているためです。 しかし、コンピュータは MSFT を単なる文字列であると見なします。

Office XP の新しいスマート タグ機能は、Office ドキュメントにこのようなコンテキストを追加する、または独自の新たなコンテキストを構築するための優れたツールです。 たとえば、誰かがドキュメントに "555-555-1212" と入力したときに、スマート タグはこれを電話番号として認識し、Microsoft OutlookR の新しい連絡先レコードを追加するオプションを提供し、その電話番号を新しい連絡先フォルダに追加するよう設定できます。しかし、とある製造会社が同じ番号付けの手法を部品番号に使用している場合は、そのコンテキストは変化します。そのような場合、その企業では Microsoft Access Version 2002 データベースに格納された在庫レベルに対して部品番号を相互参照するオプションを提供できます。スマート タグは、現在 Microsoft Word Version 2002、Microsoft Excel Version 2002、Microsoft Outlook Version 2002 (Word Version 2002 を電子メール エディタとして使用している場合)、および Internet Explorer 5.01 以上で使用できます。作成したドキュメントでスマート タグを表示および使用できるようにするには、ユーザーはコンピュータに Office XP をインストールする必要があります。以下の図 1 は、スマート タグがどのように見えるかを示しています。

Aa140238.odc_smarttags1(ja-jp,office.10).gif

図 1. アクションのスマート タグ

スマート タグ XML (Extensible Markup Language) リスト スキーマと関連して XML を使用することにより、スマート タグを作成することもできます。ただし、このソリューションはコンテキストに応じて提供できるアクションが HTTP ベースに限られるため、それほど拡張性があるわけではありません。プログラムから自動的にスマート タグにアクセスする場合の最善の選択肢は、DLL を作成することです。

スマート タグ DLL を開発するには、Office XP 以外に Microsoft Visual Basic 6.0 Professional Edition などのコンポーネント オブジェクト モデル (COM) 開発システムが必要になります。Office の Microsoft Visual Basic for Applications (VBA) 開発環境はスマート タグ DLL を作成する機能を提供しません。

この記事では、コードを使用してスマート タグ DLL を作成する方法を調べます。 以下のコード例と手順に従うことにより、初歩のスマート タグ DLL の開発、 コンパイル、登録、およびテストが行えます。

スマート タグ DLL の開発方法および XML または HTML を使用したスマート タグの作成に関する詳細については、Office XP Developer に収録されるスマート タグ SDK を参照してください。

スマート タグ インターフェイスの調査

スマート タグを作成するために、Office XP は Microsoft Smart Tags 1.0 タイプ ライブラリを提供します。このタイプ ライブラリは、インターフェイスにグループ化されたプロパティとメソッドのコレクションで構成されます。インターフェイスはプロパティとメソッドのグループで、開発中の試行錯誤やエラーを少なくするある種の青写真 として機能します。

Microsoft Smart Tags 1.0 タイプ ライブラリには 2 つの主要なインターフェイスがあります。1 つは ISmartTagRecognizer インターフェイスで、認識した文字列に赤色の点線の下線を引き、[スマート タグ動作] ボタンを表示することにより、文字列をスマート タグとして動作可能であると認証します。もう 1 つは ISmartTagAction インターフェイスで、[スマート タグ動作] ボタンがクリックされたときの動作のリストを提供し、リストから選択した動作を実行します。

以下の表 1 は ISmartTagRecognizer インターフェイスのプロパティとメソッドを一覧し、表 2 は ISmartTagAction インターフェイスのプロパティとメソッドを一覧します。スマート タグを作成するときは、これら 2 つのインターフェイスで指定されているとおりに、18 個すべてのプロパティとメソッドにインプリメンテーション コードを追加する必要があります。以下のコード サンプルでこれらのメンバをより詳しく見ていきましょう。

表 1. ISmartTagRecognizer インターフェイスのメンバ

メンバ 説明
Desc プロパティ スマート タグ レコグナイザの説明。
Name プロパティ レコグナイザの名前。Word と Excel の両方の [スマート タグ] タブ ([ツール] メニューの [オートコレクトのオプション] ダイアログ ボックス) に表示される 名前。
ProgID プロパティ レコグナイザのクラスの一意識別子 (プログラム ID)。
Recognize メソッド 文字列がスマート タグとして 動作可能であると認証します。
SmartTagCount プロパティ このレコグナイザが認証するスマート タグの種類数。
SmartTagDownloadURL プロパティ [その他のスマート タグ] ボタン ([ツール] メニューの [オートコレクトのオプション] ダイアログ ボックスの [スマート タグ] タブ) がクリックされた場合にナビゲート される URL。
SmartTagName プロパティ レコグナイザがサポートするスマート タグの種類の一意識別子。

表 2. ISmartTagAction インターフェイスのメンバ

メンバ 説明
Desc プロパティ スマート タグ アクションの説明。
InvokeVerb メソッド [スマート タグ動作] メニューの 項目がクリックされたときに発生する動作。
Name プロパティ アクションのタイトル。
ProgID プロパティ アクションのクラスの一意識別子 (プログラム ID)。
SmartTagCaption プロパティ [スマート タグ動作] メニューの 先頭に表示されるキャプション。
SmartTagCount プロパティ 認証に対応するスマート タグの 種類数。
SmartTagName プロパティ スマート タグ アクションの種類。
VerbCaptionFromID プロパティ [スマート タグ動作] メニューで 使用できる動作のキャプション。
VerbCount プロパティ 指定したスマート タグの 種類に対して、サポートする動作数を決定するプロパティ。
VerbID プロパティ スマート タグ内の一意 ID (アプリケーション内で内部的に使用) を返すプロパティ。 このメカニズムは、スマート タグ DLL がサポートするさまざまな種類のスマート タグに関するスマート タグの動作を 混合、調和させるために提供されています。
VerbNameFromID プロパティ スマート タグの動作を表す 名前 (アプリケーション内で内部的に使用) を返すプロパティ。たとえば、スマート タグ動作の文字列 "View Microsoft Web site" では、このプロパティは "viewMSWebsite" のようなものを返します。

これで、スマート タグ インターフェイスがどのように機能するか理解できたことになります。 では、初歩のスマート タグ DLL のコードを作成してみましょう。

初歩のスマート タグ DLL の開発

このスマート タグ ソリューションでは、ユーザーが Word、Excel、Outlook (Word を電子メール エディタとして使用する場合)、 または Internet Explorer (Word または Excel ドキュメントが Web ページとして保存されている場合) で、 ドキュメントに単語 "Access"、"Excel"、"Office"、"Outlook"、"PowerPoint"、または "Word"を入力した場合、 あるいはそれらの単語上にマウス ポインタを置いた場合、[スマート タグ動作] ボタンを表示します。 [スマート タグ動作] ボタンがクリックされると、メニューが表示され、ユーザーは Office アプリケーションに関する Microsoft Web サイトの選択に移動できます。

DLL プロジェクトの作成

このプロジェクトでは Visual Basic 6.0 を使用します。 まず最初に、カスタム スマート タグ DLL のコードを含める DLL プロジェクトを作成し、セットアップします。 このプロジェクトが正しく機能するためには、同一の開発用コンピュータに Visual Basic 6.0 Professional Edition (または Enterprise Edition) 以降と Office XP がインストールされている必要があります。 サンプル ファイルをダウンロードした場合は、次の手順は省略できます。 サンプル ファイルへのリンクはこの記事の先頭にあります。 サンプル ファイルのコードには詳しくコメントを付けていますので、 以下で説明するコードを理解しにくい場合は、サンプル ファイルを参照してください。

DLL プロジェクトを作成し、セットアップするには

  1. Visual Basic 6.0 の [新しいプロジェクト] ダイアログ ボックスで、 ActiveX DLL をダブル クリックします。

  2. [プロジェクト] メニューの [Project1 のプロパティ] をクリックします。

  3. [プロジェクト名] ボックスに「MicrosoftWebSite」と入力し、[OK] をクリックします。

  4. [プロパティ] ウィンドウの [(オブジェクト名)] ボックスに表示される Class1SmartTagRecognizer に変更します。

  5. [プロジェクト] メニューで [参照設定] をクリックし、[Microsoft Smart Tags 1.0 Type Library] を選択後 [OK] をクリックします。

  6. SmartTagRecognizer クラスのコードの (General)-(Declarations) セクションに以下のコード を入力します。
    Implements ISmartTagRecognizer

  7. [プロジェクト] メニューで [クラス モジュールの追加] をクリックします。 その後 [開く] をクリックします。

  8. [プロパティ] ウィンドウの [(オブジェクト名)] ボックスに表示される Class1SmartTagAction に変更します。

  9. SmartTagAction クラスのコードの (General)-(Declarations) セクションに以下のコード を入力します。
    Implements ISmartTagAction

  10. [プロジェクト] メニューの [MicrosoftWebSite のプロパティ] をクリックします。 [コンポーネント] タブで、[プロジェクト互換] をクリックし、[OK] をクリックします。

  11. ここまでの作業を保存します。

これで DLL プロジェクトがセットアップできたので、ISmartTagRecognizer インターフェイスを実装しましょう。

ISmartTagRecognizer インターフェイスの実装

ISmartTagRecognizer インターフェイスを実装するには、以下の 4 つの手順を実行します。

  1. スマート タグ レコグナイザの一意 ID、タイトル、および説明を指定するために、 次のように SmartTagRecognizer クラスの ProgIdName、 および Desc プロパティにコードを追加します。

    Private Property Get ISmartTagRecognizer_ProgId() _
            As String
    
        ISmartTagRecognizer_ProgId = _
            "MicrosoftWebSite.SmartTagRecognizer"
    
    End Property
    
    Private Property Get ISmartTagRecognizer_Name _
            (ByVal LocaleID As Long) As String
    
        ISmartTagRecognizer_Name = _
            "Microsoft Web Sites Smart Tag"
    
    End Property
    
    Private Property Get ISmartTagRecognizer_Desc _
            (ByVal LocaleID As Long) As String
    
        ISmartTagRecognizer_Desc = _
            "Directs users to related Microsoft Web sites"
    
    End Property
    
  2. スマート タグの種類数、スマート タグ アクションの種類のリスト、レコグナイザに追加するスマート タグ のダウンロード場所を指定するために、次のように SmartTagRecognizer クラスの SmartTagCountSmartTagName、および SmartTagDownload プロパティ にコードを追加します。

    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 = _
                "my-company-com#mswebsite"
        End If
    
    End Property
    
    Private Property Get ISmartTagRecognizer_SmartTagDownloadURL _
            (ByVal SmartTagID As Long) As String
    
        ISmartTagRecognizer_SmartTagDownloadURL = Null
    
    End Property
    
  3. レコグナイザに項目のリストを指定するために、 次のように SmartTagRecognizer クラスの (General)-(Declarations) セクションと Class_Initialize ルーチンにコードを追加します。

    Dim garrTerms(6) As String   
    Dim gintNumTerms As Integer  
    
    Private Sub Class_Initialize()
    
        garrTerms(1) = "office"
        garrTerms(2) = "access"
        garrTerms(3) = "excel"
        garrTerms(4) = "outlook"
        garrTerms(5) = "powerpoint"
        garrTerms(6) = "word"
        gintNumTerms = 6
    
    End Sub
    
  4. Word、Excel、または Outlook ドキュメント (Word を電子メール エディタに使用しているとき) に テキストが入力されるたびにスマート タグとして動作可能な文字列を検索するために、 次のように SmartTagRecognizer クラスの Recognize メソッドに コードを追加します。

    Private 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 stlPropertyBag As SmartTagLib.IsmartTagProperties
    
        Text = LCase(String:=Text)
    
        For intLoop = 1 To gintNumTerms
            intIndex = InStr(Text, garrTerms(intLoop))
            intTermLen = Len(garrTerms(intLoop))
            Do While intIndex > 0
                Set stlPropertyBag = _
                    RecognizerSite.GetNewPropertyBag
                RecognizerSite.CommitSmartTag _
                    "my-company-com#mswebsite", intIndex, _
                    intTermLen, stlPropertyBag
                intIndex = InStr(intIndex + intTermLen, _
                    Text, garrTerms(intLoop))
            Loop
    
        Next intLoop
    
    End Sub
    

これで ISmartTagRecognizer インターフェイスの実装が完了したので、 ISmartTagAction インターフェイスを実装しましょう。

ISmartTagAction インターフェイスの実装

ISmartTagAction インターフェイスを実装するには、以下の 4 つの手順を実行します。

  1. スマート タグ アクション DLL の一意 ID、タイトル、および説明を指定するために、 次のように SmartTagAction クラスの ProgIdName、 および Desc プロパティにコードを追加します。

    Private Property Get ISmartTagAction_ProgId() As String
    
        ISmartTagAction_ProgId = _
            "MicrosoftWebSite.SmartTagAction"
    
    End Property
    
    Private Property Get ISmartTagAction_Name _
            (ByVal LocaleID As Long) As String
    
        ISmartTagAction_Name = "Microsoft Web site actions"
    
    End Property
    
    Private Property Get ISmartTagAction_Desc _
            (ByVal LocaleID As Long) As String
    
        ISmartTagAction_Desc = _
            "Provides actions for certain Microsoft product names"
    
    End Property
    
  2. 対応するスマート タグ レコグナイザが検索するタグの種類の数、名前、およびキャプションを通知するために、 次のように SmartTagAction クラスの SmartTagCountSmartTagName、および SmartTagCaption プロパティにコードを追加します。

    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 = _
                "my-company-com#mswebsite"
        End If
    
    End Property
    
    Private Property Get ISmartTagAction_SmartTagCaption _
            (ByVal SmartTagID As Long, _
            ByVal LocaleID As Long) _
            As String
    
        ISmartTagAction_SmartTagCaption = _
            "Selected Microsoft Web Sites"
    
    End Property
    
  3. 対応するスマート タグ レコグナイザがサポートするスマート タグ アクションの種類の数、名前、および ID を通知するために、次のように SmartTagAction クラスの VerbCountVerbIDVerbCaptionFromID、および VerbNameFromID プロパティにコードを追加します。

    Private Property Get ISmartTagAction_VerbCount _
            (ByVal SmartTagName As String) As Long
    
        If SmartTagName = "my-company-com#mswebsite" 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 = _
                    "Microsoft Office"
            Case 2
                ISmartTagAction_VerbCaptionFromID = _
                    "Microsoft Access"
            Case 3
                ISmartTagAction_VerbCaptionFromID = _
                    "Microsoft Excel"
            Case 4
                ISmartTagAction_VerbCaptionFromID = _
                    "Microsoft Outlook"
            Case 5
                ISmartTagAction_VerbCaptionFromID = _
                    "Microsoft PowerPoint"
            Case 6
                ISmartTagAction_VerbCaptionFromID = _
                    "Microsoft Word"
        End Select
    
    End Property
    
    Private Property Get ISmartTagAction_VerbNameFromID _
            (ByVal VerbID As Long) As String
    
        Select Case VerbID
            Case 1
                ISmartTagAction_VerbNameFromID = "Office"
            Case 2
                ISmartTagAction_VerbNameFromID = "Access"
            Case 3
                ISmartTagAction_VerbNameFromID = "Excel"
            Case 4
                ISmartTagAction_VerbNameFromID = "Outlook"
            Case 5
                ISmartTagAction_VerbNameFromID = "PowerPoint"
            Case 6
                ISmartTagAction_VerbNameFromID = "Word"
        End Select
    
    End Property
    
  4. 対応する [スマート タグのオプション] ボタンがクリックされるたびに、スマート タグ アクションの一覧を 表示するために、次のように SmartTagAction クラスの 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 ieInternetExplorer As Variant
    
        Set ieInternetExplorer = _
            CreateObject("InternetExplorer.Application")
    
        With ieInternetExplorer
            Select Case VerbID
                Case 1
                    .Navigate2 "www.microsoft.com/office"
                Case 2
                    .Navigate2 "www.microsoft.com/access"
                Case 3
                    .Navigate2 "www.microsoft.com/excel"
                Case 4
                    .Navigate2 "www.microsoft.com/outlook"
                Case 5
                    .Navigate2 "www.microsoft.com/powerpoint"
                Case 6
                    .Navigate2 "www.microsoft.com/word"
            End Select
    
            .Visible = True
        End With
    
    End Sub
    

これでコーディングは完了です。コンパイルして、コンピュータにスマート タグ DLL を登録できます。 その後、これが正しく機能するか確認します。

スマート タグ DLL のコンパイルと登録

スマート タグ DLL をコンパイルするには、Visual Basic 6.0 の [ファイル] メニューの [MicrosoftWebSite.dll の作成] をクリックします。 スマート タグ DLL を登録するには、コンピュータのレジストリを操作して以下のサブキーを編集する 必要があります。

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

これらの各サブキーに、上記で選択した一意識別子に一致する名前を持つ新しいサブキーを作成する必要があります。このサブキーにはスマート タグのアクションおよびレコグナイザの各クラスに対応する CLSID を使用します。

注意: クラスの登録に ProgID を使用することもできますが、その場合には、Office アプリケーションのメニューからスマート タグの解除が行えなくなる場合があるため、実際に登録を行う場合には CLSID を使用してください。

コンピュータのレジストリを手動で変更することはお勧めできないので、 Microsoft Visual StudioR インストーラなど登録パッケージを作成するツールの使用を検討してください。このツールは、複数のデスクトップにプログラムを配布するための、セットアップ プログラムの作成を容易にします。Visual Studio インストーラのダウンロードと使用の詳細については、Visual Studio Web サイトをご覧ください。スマート タグ SDK には役に立つチュートリアルも含まれており、Visual Studio インストーラを使った登録パッケージの作成方法、およびテスト目的のために手動でサブキーを登録する方法が示されています。

スマート タグ DLL を登録すると、その DLL をテストできるようになります。

スマート タグ DLL のテスト

スマート タグ DLL をテストするには、

  1. Word Version 2002 を起動し、「PowerPoint」と入力します。

  2. スマート タグ認証をアクティブにするために、Space キーまたは Enter キーを押します。 その結果、単語 "PowerPoint" には赤の点線で下線が引かれます。

  3. この赤の点線にマウス ポインタを置きます。 すると、[スマート タグ動作] ボタンが表示されます。

  4. [スマート タグ動作] ボタンにマウス ポインタを合わせ、動作メニューをアクティブにするために ボタンの矢印をクリックします。

  5. Internet Explorer を起動し、PowerPoint Web サイトに移動するには、 [Microsoft PowerPoint] をクリックします。

まとめ

Office XP でスマート タグ DLL を開発する方法に簡単に触れてきました。 スマート タグ SDK には以下の項目に関する詳細情報が含まれています。

  • 別の種類のスマート タグの登録。

  • スマート タグ DLL に別のスマート タグ値や動作を "ハード コーディング" する代わりに、 Extensible Markup Language (XML) ファイルを使用したタグ値や動作の登録。

  • スマート タグ開発の問題点のトラブルシューティング

  • 会社のデスクトップまたはインターネット環境へのスマート タグ ソリューションの配布。

  • Microsoft Visual C++R などのほかの COM ベースの言語を使用したスマート タグ DLL の開発。

この記事で説明したコード例の拡張に興味がある方は、Office XP Developer で提供されるスマート タグ SDK をご覧ください。