COMMENT FAIRE : Créer une DLL de balises actives dans ATL en vue de son utilisation dans Office XP

Ancien nº de publication de cet article : F292596
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Résumé
Les balises actives (" Smart Tags ") sont une technologie introduite avec Office XP, qui offre aux utilisateurs d'Office un plus haut degré d'interactivité avec le contenu de leurs documents Office. Une balise active est un élément de texte d'un document Office qui est reconnu comme étant associé à des actions personnalisées. Un exemple de l'un de ces éléments spéciaux de texte peut être le nom d'une adresse électronique tapé dans un document Word ou un classeur Excel. Si le nom d'une adresse électronique est reconnu en tant que balise active, l'utilisateur reçoit la proposition d'une ou plusieurs actions à exécuter sur ce texte, notamment la recherche d'informations supplémentaires sur le contact ou l'envoi d'un nouveau message électronique à ce contact.

Vous pouvez étendre les capacités de Office XP en développant votre propre bibliothèque de liaison dynamique (DLL) de reconnaissance / d'action de balises actives à utiliser dans les documents Office. Cet article décrit la procédure à suivre pour créer une DLL de balises actives à l'aide de Active Template Library (ATL) et indique les paramètres de registre requis pour que Microsoft Office XP identifie et utilise votre DLL de balises actives.

REMARQUE : Excel 2002 et Word 2002 sont les seules applications Office XP prenant en charge les balises actives. Il vous est toutefois possible d'utiliser les informations présentées dans le présent article pour développer des balises actives pour n'importe quelle application qui adopte la technologie des balises actives.Une DLL de balises actives est une DLL COM (Component Object Model) standard qui met en œuvre deux interfaces spéciales : ISmartTagRecognizer et ISmartTagAction. L'interface ISmartTagRecognizer reconnaît le texte tapé dans un document en tant que balise active. L'interface ISmartTagAction exécute des actions sur une chaîne de balise active particulière à la demande de l'utilisateur. Il n'est pas indispensable que ces interfaces soient mises en œuvre dans la même DLL. Vous pouvez avoir une DLL de reconnaissance et une ou plusieurs DLL d'action qui associent différentes actions à un même type de balise active.

Retour au début


Procédure de création d'une DLL de balises actives dans ATL

La procédure suivante permet de créer une DLL simple de balises actives qui reconnaît les contacts MSN Instant Messenger et permet à l'utilisateur d'envoyer un message électronique ou un message instantané au contact reconnu. Instant Messenger est nécessaire pour utiliser cet exemple. Si vous ne possédez pas Instant Messenger, vous pouvez en obtenir une copie à partir du site Web MSN suivant :
  1. Dans Visual C++, créez un nouveau projet ATL COM AppWizard. Nommez ce projet MessengerSmartTag.
  2. Cliquez sur OK pour démarrer l'Assistant ATL COM. Dans la boîte de dialogue suivante, assurez-vous que l'option Bibliothèque de liaison dynamique est sélectionnée et cliquez sur Terminer. Cliquez sur OK pour créer le projet.
  3. Pour créer la classe Modules de reconnaissance, dans le menu Insertion, cliquez sur Nouvel objet ATL. Sélectionnez Objet simple et cliquez sur Suivant. Comme nom court, tapez Reconnaissance et cliquez sur OK.
  4. Pour créer la classe Action, suivez les instructions de l'étape 3, mais tapez Action comme nom court.
  5. Ouvrez ClassView et développez Classes MessengerSmartTag. Cliquez avec le bouton droit sur la classe CRecognizer et sélectionnez Implémenter l'interface. Cliquez sur OK lorsque la boîte de dialogue d'avertissement s'affiche. Cliquez sur Parcourir et sélectionnez Bibliothèque de type Microsoft Smart Tags 1.0. Sélectionnez l'interface ISmartTagRecognizer et cliquez sur OK.

    REMARQUE : L'emplacement par défaut de la Bibliothèque de type Microsoft Smart Tags 1.0 est C:\Program Files\Common Files\Microsoft Shared\Mstag.tlb.
  6. Dans ClassView, cliquez avec le bouton droit sur la classe CAction et sélectionnez Implémenter l'interface. Cliquez sur OK lorsque la boîte de dialogue d'avertissement s'affiche. Cliquez sur Parcourir et sélectionnez Bibliothèque de type Microsoft Smart Tags 1.0. Sélectionnez l'interface ISmartTagAction et cliquez sur OK.
  7. Ouvrez le fichier Recognizer.h et remplacez le contenu de classe par le code suivant :
    ///////////////////////////////////////////////////////////////////////////// // CRecognizerclass ATL_NO_VTABLE CRecognizer :    public CComObjectRootEx<CComSingleThreadModel>,   public CComCoClass<CRecognizer, &CLSID_Recognizer>,   public IDispatchImpl<IRecognizer, &IID_IRecognizer, &LIBID_MESSENGERSMARTTAGLib>,   public IDispatchImpl<ISmartTagRecognizer, &IID_ISmartTagRecognizer, &LIBID_SmartTagLib>{public:    CRecognizer();    ~CRecognizer();DECLARE_REGISTRY_RESOURCEID(IDR_RECOGNIZER)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CRecognizer)    COM_INTERFACE_ENTRY(IRecognizer)//Removed -- COM_INTERFACE_ENTRY(IDispatch)    COM_INTERFACE_ENTRY2(IDispatch, IRecognizer)    COM_INTERFACE_ENTRY(ISmartTagRecognizer)END_COM_MAP()// IRecognizerpublic:// ISmartTagRecognizer    STDMETHOD(get_ProgId)(BSTR * ProgId);    STDMETHOD(get_Name)(INT LocaleID, BSTR * Name);    STDMETHOD(get_Desc)(INT LocaleID, BSTR * Desc);    STDMETHOD(get_SmartTagCount)(INT * Count);    STDMETHOD(get_SmartTagName)(INT SmartTagID, BSTR * Name);    STDMETHOD(get_SmartTagDownloadURL)(INT SmartTagID, BSTR * DownloadURL);    STDMETHOD(Recognize)(BSTR Text, IF_TYPE DataType, INT LocaleID,                  ISmartTagRecognizerSite * RecognizerSite);private:    long lCount;    SAFEARRAY *psa;};
  8. Ouvrez le fichier Recognizer.cpp et ajoutez le code suivant à la fin du fichier :
    CRecognizer::CRecognizer(){    Messenger::IMsgrObject2Ptr oMsgrObj = NULL;    Messenger::IMsgrUsersPtr oUsers = NULL;    Messenger::IMsgrUserPtr oUser = NULL;    SAFEARRAYBOUND rgsaBound[1];    long rgIndices[1];    HRESULT hr;    // Crée une instance Instant Messenger.    oMsgrObj.CreateInstance("Messenger.MsgrObject");    // Obtient la liste des contacts    oUsers = oMsgrObj->GetList(Messenger::MLIST_CONTACT);    // Enregistre le nombre de contacts dont vous disposez.    lCount = oUsers->GetCount();    rgsaBound[0].lLbound = 0;    rgsaBound[0].cElements = lCount;    // Crée un SAFEARRAY pour contenir la liste de contacts.    psa = SafeArrayCreate(VT_VARIANT, 1, rgsaBound);    // Parcourt tous les contacts.    for (long l=0; l<lCount-1; l++)    {        rgIndices[0] = l;        // Définit l'utilisateur spécifique.        oUser = oUsers->Item(l);        // Convertit le Nom convivial en minuscules        // et le stocke dans VARIANT.        _variant_t v = _wcslwr(oUser->GetFriendlyName());        // Ajoute VARIANT à SAFEARRAY.       hr = SafeArrayPutElement(psa, rgIndices, &v);    }}CRecognizer::~CRecognizer(){    // Supprime SAFEARRAY.    SafeArrayDestroy(psa);}HRESULT CRecognizer::get_ProgId(BSTR * ProgId){    // Définit le ProgID de l'interface Recognizer.    *ProgId = SysAllocString(L"MessengerSmartTag.Recognizer");    return S_OK;}HRESULT CRecognizer::get_Name(INT LocaleID, BSTR * Name){    // Définit un titre court pour le module de reconnaissance.    *Name = SysAllocString(L"Microsoft Messenger Contacts Visual C++ Recognizer");    return S_OK;}HRESULT CRecognizer::get_Desc(INT LocaleID, BSTR * Desc){    // Définit une description longue pour le module de reconnaissance.    *Desc = SysAllocString(L"Microsoft Messenger reconnaît vos contacts Instant Messenger");    return S_OK;}HRESULT CRecognizer::get_SmartTagCount(INT * Count){    // Définit le nombre de balises actives pris en charge.    *Count = 1;    return S_OK;}HRESULT CRecognizer::get_SmartTagName(INT SmartTagID, BSTR * Name){    // Cette méthode est appelée autant de fois que vous     // retournez dans SmartTagCount. Cette méthode détermine un nom unique    // pour la balise active.    *Name = SysAllocString(L"microsoft/messenger#contacts");    return S_OK;}HRESULT CRecognizer::get_SmartTagDownloadURL(INT SmartTagID, BSTR * DownloadURL){    // Définit l'URL qui sera intégrée dans les documents.    *DownloadURL = NULL;    return S_OK;}HRESULT CRecognizer::Recognize(BSTR Text, IF_TYPE DataType, INT LocaleID,       ISmartTagRecognizerSite * RecognizerSite){    // La méthode Recognize est appelée et reçoit une valeur de texte.    // Vous devez reconnaître les chaînes dans le texte et configurer les actions.    WCHAR *pch, *strText = _wcslwr(Text);    ISmartTagProperties  *pSmartTagProp = NULL;    long rgIndices[1];    HRESULT hr;    // Recherche sur tous les contacts    for (long l = 0; l<lCount; l++).    {        rgIndices[0] = l;        // Permet d'obtenir le nom du contact.        _variant_t v;        hr = SafeArrayGetElement(psa,rgIndices,&v);        // Convertit VARIANT en BSTR.        _bstr_t bstrContact = v;        // Parcourt la chaîne à la recherche des contacts.        for (pch = strText; (pch = wcsstr(pch, bstrContact))!=NULL; pch++)        {                // Crée une nouvelle boîte de propriétés.            hr = RecognizerSite->GetNewPropertyBag(&pSmartTagProp);            if (SUCCEEDED(hr)) {                // Place la Balise active dans la boîte de propriétés.                hr = RecognizerSite->CommitSmartTag(                      _bstr_t("microsoft/messenger#contacts"),                      pch - strText+1, wcslen(bstrContact),                      pSmartTagProp);                                if (pSmartTagProp != NULL)                    pSmartTagProp->Release();            }        }    }    return S_OK;}
  9. Ouvrez le fichier Action.h et remplacez le contenu de classe par le code suivant :
    ///////////////////////////////////////////////////////////////////////////// // CActionclass ATL_NO_VTABLE CAction :    public CComObjectRootEx<CComSingleThreadModel>,   public CComCoClass<CAction, &CLSID_Action>,   public IDispatchImpl<IAction, &IID_IAction, &LIBID_MESSENGERSMARTTAGLib>,   public IDispatchImpl<ISmartTagAction, &IID_ISmartTagAction, &LIBID_SmartTagLib>{public:   CAction(){}DECLARE_REGISTRY_RESOURCEID(IDR_ACTION)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CAction)    COM_INTERFACE_ENTRY(IAction)//Removed -- COM_INTERFACE_ENTRY(IDispatch)    COM_INTERFACE_ENTRY2(IDispatch, IAction)    COM_INTERFACE_ENTRY(ISmartTagAction)END_COM_MAP()// IActionpublic:// ISmartTagAction    STDMETHOD(get_ProgId)(BSTR * ProgId);    STDMETHOD(get_Name)(INT LocaleID, BSTR * Name);    STDMETHOD(get_Desc)(INT LocaleID, BSTR * Desc);    STDMETHOD(get_SmartTagCount)(INT * Count);    STDMETHOD(get_SmartTagName)(INT SmartTagID, BSTR * Name);    STDMETHOD(get_SmartTagCaption)(INT SmartTagID, INT LocaleID,                  BSTR * Caption);    STDMETHOD(get_VerbCount)(BSTR SmartTagName, INT * Count);    STDMETHOD(get_VerbID)(BSTR SmartTagName, INT VerbIndex, INT * VerbID);    STDMETHOD(get_VerbCaptionFromID)(INT VerbID, BSTR ApplicationName,                  INT LocaleID, BSTR * Caption);    STDMETHOD(get_VerbNameFromID)(INT VerbID, BSTR * Name);    STDMETHOD(InvokeVerb)(INT VerbID, BSTR ApplicationName,                  IDispatch * Target, ISmartTagProperties * Properties,                  BSTR Text, BSTR Xml);};
  10. Ouvrez le fichier Action.cpp et ajoutez le code suivant à la fin du fichier :
    HRESULT CAction::get_ProgId(BSTR * ProgId){   // Définit le ProgID de l'interface Action.   *ProgId = SysAllocString(L"MessengerSmartTag.Action");   return S_OK;}HRESULT CAction::get_Name(INT LocaleID, BSTR * Name){   // Définit un nom court décrivant l'Action.   *Name = SysAllocString(L" Balise active Messenger");   return S_OK;}HRESULT CAction::get_Desc(INT LocaleID, BSTR * Desc){   // Définit une description longue pour l'Action.   *Desc = SysAllocString(L"Fournit des actions pour la balise active Messenger");   return S_OK;}HRESULT CAction::get_SmartTagCount(INT * Count){    // Définit le nombre de balises actives que cette action prend en charge.    *Count = 1;    return S_OK;}HRESULT CAction::get_SmartTagName(INT SmartTagID, BSTR * Name){    // Cette méthode est appelée autant de fois que vous     // retournez dans SmartTagCount. Cette méthode détermine un nom unique    // pour la balise active.    *Name = SysAllocString(L"microsoft/messenger#contacts");    return S_OK;}HRESULT CAction::get_SmartTagCaption(INT SmartTagID, INT LocaleID, BSTR * Caption){    // Cette légende est affichée dans le menu de la balise active.    *Caption = SysAllocString(L"Balise active Messenger");    return S_OK;}HRESULT CAction::get_VerbCount(BSTR SmartTagName, INT * Count){    // Retourne le nombre de mots pris en charge.    if (wcsstr(SmartTagName,L"microsoft/messenger#contacts") != 0) {        *Count = 2;    }    return S_OK;}HRESULT CAction::get_VerbID(BSTR SmartTagName, INT VerbIndex, INT * VerbID){    // Retourne un ID unique pour chaque mot pris en charge.    *VerbID = VerbIndex;    return S_OK;}HRESULT CAction::get_VerbCaptionFromID(INT VerbID, BSTR ApplicationName,                     INT LocaleID, BSTR * Caption){    // Définit une légende pour chaque mot. Celle-ci est affichée    // dans le menu Balise active.    switch (VerbID) {      case 1:        *Caption = SysAllocString(L"Envoyer un message instantané à ce contact");        break;      case 2:        *Caption = SysAllocString(L" Envoyer un message électronique à ce contact ");        break;      default:        *Caption = NULL;        break;    }    return S_OK;}HRESULT CAction::get_VerbNameFromID(INT VerbID, BSTR * Name){    // Définit un nom de chaîne pour chaque mot.    switch (VerbID) {      case 1:        *Name = SysAllocString(L"SendInstantMessage");        break;      case 2:        *Name = SysAllocString(L"SendEmail");        break;    }    return S_OK;}HRESULT CAction::InvokeVerb(INT VerbID, BSTR ApplicationName,      IDispatch * Target, ISmartTagProperties * Properties,      BSTR Text, BSTR Xml){    // Cette méthode est appelée chaque fois qu'un utilisateur appelle un mot    // dans le menu Balise active.    Messenger::IMessengerApp2Ptr oMessenger = NULL;    Messenger::IMsgrObject2Ptr oMsgrObj = NULL;    Messenger::IMsgrUsersPtr oUsers = NULL;    Messenger::IMsgrUserPtr oUser = NULL;    _variant_t v;		     // Crée une instance Instant Messenger.    oMessenger.CreateInstance("Messenger.MessengerApp");    oMsgrObj.CreateInstance("Messenger.MsgrObject");    // Obtient une liste de contacts.    oUsers = oMsgrObj->GetList(Messenger::MLIST_CONTACT);    // Parcourt tous les contacts.    for (long l=0; l<(oUsers->GetCount()-1); l++)    {        // Obtient un contact spécifique.        oUser = oUsers->Item(l);        // Vérifie si le contact est correct.        if (wcscmp(_wcslwr(oUser->GetFriendlyName()),_wcslwr(Text)) == 0)        {            switch (VerbID) {              case 1:                // L'utilisateur souhaite afficher la zone Message instantané                // pour envoyer un message au contact.                v = oUser.GetInterfacePtr();                oMessenger->LaunchIMUI(v);                break;              case 2:                // Exécute le protocole "mailto" pour démarrer le                // programme de messagerie de l'utilisateur et créer un nouveau message.                _bstr_t bstrTemp = "mailto:";                bstrTemp += oUser->GetEmailAddress();                ShellExecute(0,"open",bstrTemp,NULL,NULL,1);                break;            }        }    }    return S_OK;}
  11. Ouvrez le fichier Stdafx.h et ajoutez la ligne suivante après la ligne indiquant #include <atlcom.h> :
    #import "C:\Program Files\Messenger\msmsgs.exe"
    REMARQUE : Modifiez le chemin du fichier Msmsgs.exe le cas échéant pour qu'il corresponde au point d'installation de Microsoft Instant Messenger. L'emplacement par défaut de Instant Messenger est C:\Program Files\Messenger.
  12. Appuyez sur F7 pour générer la DLL.

Retour au début


Procédure d'enregistrement d'une DLL de balises actives

Pour pouvoir utiliser une DLL de balises actives, vous devez l'enregistrer sur le système. L'enregistrement COM normal est effectué pour vous lorsque vous compilez le projet ou appelez Regsvr32.exe avec le nom de la DLL. Vous devez créer des entrées de registre supplémentaires qui ne font pas partie de l'enregistrement COM normal de sorte que les applications Office puissent identifier la DLL en tant que DLL de balises actives. Pour cela, procédez comme suit :
  1. À partir d'une ligne de commande, démarrez Regedit.exe.
  2. À HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Actions, ajoutez une sous-clé intitulée MessengerSmartTag.Action.
  3. Sous HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Actions, ajoutez une sous-clé intitulée MessengerSmartTag.Recognize.
  4. Fermez l'Éditeur du registre.

Retour au début


Procédure de test d'une DLL de balises actives

Les balises actives obéissent au même modèle de sécurité que les macros. Si les paramètres de sécurité de l'application sont définis sur Haute, la DLL de balises actives ne se charge pas si la DLL n'a pas une signature numérique (comme c'est le cas avec les macros VBA). Pour plus d'informations sur la signature numérique, consultez la section " Références ".

Pour tester la DLL de reconnaissance / d'action personnalisée de balises actives dans Word, procédez comme suit :
  1. Démarrez Instant Messenger et ouvrez une session.

    REMARQUE : L'exemple de balise active nécessite que vous ouvriez une session dans Instant Messenger ; si vous n'ouvrez pas de session Instant Messenger, la DLL personnalisée se chargera, mais elle ne reconnaîtra pas les contacts.
  2. Démarrez Word 2002. Dans le menu Outils, pointez sur Macro, puis cliquez sur Sécurité. Réglez la sécurité des macros sur Moyenne, puis cliquez sur OK. Si la sécurité des macros était précédemment réglée sur Haute, redémarrez Word.
  3. Tapez le nom convivial d'un contact dans un nouveau document (Jacques Sentier, par exemple) et appuyez sur ENTRÉE. Une ligne floue apparaît sous le nom convivial pour indiquer qu'il est reconnu en tant que balise active. Placez le pointeur de la souris sur le nom convivial et le bouton Action de balise active apparaît.
  4. Cliquez sur Action de balise active et sélectionnez l'un des éléments d'action personnalisée dans le menu déroulant. Vous pouvez envoyer un message électronique ou un message instantané au contact à partir de votre nouveau document.
Vous pouvez suivre une procédure similaire pour tester la DLL de balises actives dans Excel 2002.


Retour au début


Dépannage

Si vous rencontrez des difficultés à faire fonctionner vos balises actives, assurez-vous en premier lieu que la DLL de balises actives personnalisée est chargée. Dans Word ou Excel, dans le menu Outils, cliquez sur Options de correction automatique, sur l'onglet Balise active, et assurez-vous que l'option Marquer le texte avec des balises actives est sélectionnée et que votre DLL de balises actives est répertoriée et sélectionnée. Si votre balise active n'est pas répertoriée, elle n'est peut-être pas enregistrée correctement.

Si l'exécution de la classe Reconnaissance ou Action personnalisée est à l'origine du problème, vous pouvez déboguer une DLL de balises actives comme n'importe quelle DLL Visual C++. Déterminez un point d'arrêt dans le constructeur de la classe Reconnaissance. Lorsque vous appuyez sur F5 pour déboguer l'application, une boîte de dialogue s'affiche et vous demande un fichier exécutable pour la session de débogage. Sélectionnez soit Winword.exe, soit Excel.exe. Lorsque Excel ou Word démarre et charge la Balise active, votre code intervient au point d'arrêt et vous pouvez ignorer le code pour le débogage.

Retour au début

RÉFÉRENCES

La documentation de ces interfaces, ainsi que la bibliothèque de type qui les définit, est fournie dans le Kit de développement (SDK) des Balises actives. Si vous ne l'avez pas déjà fait, installez le SDK de balises actives avant de procéder à la création de la balise active de l'exemple. Vous pouvez obtenir ce SDK sur le CD-ROM Microsoft Office XP Édition Développeur (MOD) ou le télécharger à partir du site Web MSDN suivant :


Pour plus d'informations sur la création de DLL de reconnaissance / d'action personnalisée de balises actives, consultez le fichier d'Aide de développement des balises actives dans le SDK de balises actives.

Pour plus d'informations sur les signatures numériques, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
247257 INFO : Procédure de signature d'un fichier .cab
Pour des informations sur l'utilisation de CLSID pour enregistrer la DLL de balises actives au lieu de ProgID, consultez l'article suivant dans la Base de connaissances Microsoft :
294422 BOGUE : L'indicateur d'état n'est pas mis à jour lors de l'activation ou de la désactivation de balises actives


Retour au début

smart tag sdk factoid
Propriétés

ID d'article : 292596 - Dernière mise à jour : 02/24/2014 17:47:55 - Révision : 5.1

  • Microsoft Excel 2002
  • Microsoft Word 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • kbnosurvey kbarchive kbatl kbgrpdso kbhowtomaster KB292596
Commentaires