HOW TO: Creare una DLL Smart tag in ATL da utilizzare in Office XP

Traduzione articoli Traduzione articoli
Identificativo articolo: 292596 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I292596
Questo articolo Ŕ stato archiviato. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

La tecnologia smart tag Ŕ stata introdotta con Office XP per fornire agli utenti una maggiore interattivitÓ con il contenuto dei documenti di Office. Uno smart tag Ŕ un elemento di testo in un documento di Office al quale sono associate azioni personalizzate. Un esempio di questo speciale elemento di testo pu˛ essere un nome di posta elettronica digitato in un documento di Word o in una cartella di lavoro di Excel. Se il nome di posta elettronica viene riconosciuto come smart tag, all'utente verranno presentate una o pi¨ azioni da eseguire in relazione a quel testo. Una possibile azione associata a un nome di posta elettronica Ŕ la ricerca di ulteriori informazioni sul contatto oppure l'invio di un nuovo messaggio di posta elettronica a quel contatto.

╚ possibile estendere le capacitÓ di Office XP sviluppando una DLL Smart tag di riconoscimento/azioni personalizzata da utilizzare nei documenti di Office. In questo articolo viene descritto come creare una DLL Smart tag utilizzando Active Template Library (ATL) e viene specificato quali impostazioni del Registro di sistema sono necessarie affinchÚ la DLL creata sia identificata e utilizzata in Office XP.

NOTA: gli smart tag sono supportati solo nelle applicazioni di Office XP Excel 2002 e Word 2002. Le informazioni fornite in questo articolo possono essere utilizzate per sviluppare smart tag per qualsiasi applicazione dotata del supporto per questa tecnologia. Una DLL Smart tag Ŕ una DLL COM (Component Object Model) standard che implementa due speciali interfacce: ISmartTagRecognizer e ISmartTagAction. L'interfaccia ISmartTagRecognizer riconosce come smart tag il testo digitato in un documento. L'interfaccia ISmartTagAction esegue azioni su una particolare stringa smart tag a richiesta dell'utente. Non Ŕ indispensabile che queste interfacce siano implementate nella stessa DLL. ╚ possibile creare una DLL di riconoscimento e una o pi¨ DLL di azioni che estendono un unico tipo di smart tag per diverse azioni.




Procedura per la creazione della DLL Smart tag in ATL


Nella seguente procedura viene creata una semplice DLL Smart tag che riconosce i contatti di Messaggistica immediata di Microsoft Network (MSN) e offre all'utente la possibilitÓ di inviare un messaggio di posta elettronica o un messaggio immediato a un contatto riconosciuto. Per utilizzare questo esempio Ŕ necessario disporre di Messaggistica immediata. Se non Ŕ disponibile, Ŕ possibile scaricare una copia di Messaggistica immediata dal seguente sito Web MSN:
http://messenger.msn.it/

  1. In Visual C++ creare un nuovo progetto con la Creazione guidata applicazioni ATL COM. Assegnare al progetto il nome MessengerSmartTag.
  2. Scegliere OK per avviare la Creazione guidata applicazioni ATL COM. Nella finestra di dialogo che verrÓ visualizzata assicurarsi che sia selezionata l'opzione Dynamic Link Library e fare clic su Finish. Scegliere OK per creare il progetto.
  3. Per creare la classe Recognizer, dal menu Insert scegliere New ATL Object. Selezionare Simple Object e fare clic su Next. Come nome breve digitare Recognizer e scegliere OK.
  4. Per creare la classe Action seguire le istruzioni nel passaggio 3, ma digitare Action come nome breve.
  5. Aprire ClassView ed espandere MessengerSmartTag classes. Fare clic con il pulsante destro del mouse sulla classe CRecognizer e scegliere Implement Interface. Scegliere OK quando viene visualizzata la finestra di dialogo di avviso. Fare clic su Browse e scegliere Microsoft Smart Tags 1.0 Type Library. Selezionare l'interfaccia ISmartTagRecognizer e scegliere OK.

    NOTA: il percorso predefinito della Libreria dei tipi Microsoft Smart Tags 1.0 Ŕ C:\Programmi\File comuni\Microsoft Shared\Mstag.tlb.
  6. In ClassView fare clic con il pulsante destro del mouse sulla classe CAction e scegliere Implement Interface. Scegliere OK quando viene visualizzata la finestra di dialogo di avviso. Fare clic su Browse e scegliere Microsoft Smart Tags 1.0 Type Library. Selezionare l'interfaccia ISmartTagAction e scegliere OK.
  7. Aprire il file Recognizer.h e sostituire il contenuto della classe con il seguente codice:
    ///////////////////////////////////////////////////////////////////////////// 
    // CRecognizer
    class 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()
    
    // IRecognizer
    public:
    // 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. Aprire il file Recognizer.cpp e aggiungere il seguente codice alla fine del file:
    CRecognizer::CRecognizer()
    {
        Messenger::IMsgrObject2Ptr oMsgrObj = NULL;
        Messenger::IMsgrUsersPtr oUsers = NULL;
        Messenger::IMsgrUserPtr oUser = NULL;
        SAFEARRAYBOUND rgsaBound[1];
        long rgIndices[1];		
        HRESULT hr;
    		
        // Create an instance of Instant Messenger.
        oMsgrObj.CreateInstance("Messenger.MsgrObject");
        // Get the list of contacts
        oUsers = oMsgrObj->GetList(Messenger::MLIST_CONTACT);
        // Store the number of contacts you have.
        lCount = oUsers->GetCount();
        rgsaBound[0].lLbound = 0;
        rgsaBound[0].cElements = lCount;
        // Create a SAFEARRAY to hold the list of contacts.
        psa = SafeArrayCreate(VT_VARIANT, 1, rgsaBound);
        // Loop through all contacts.
        for (long l=0; l<lCount-1; l++)
        {
            rgIndices[0] = l;	
            // Set the specific user.
            oUser = oUsers->Item(l);
            // Convert the Friendly Name to lower case
            // and store it in a VARIANT.
            _variant_t v = _wcslwr(oUser->GetFriendlyName());
            // Put the VARIANT into the SAFEARRAY.
           hr = SafeArrayPutElement(psa, rgIndices, &v);
        }
    }
    
    CRecognizer::~CRecognizer()
    {
        // Destroy the SAFEARRAY.
        SafeArrayDestroy(psa);
    }
    
    
    HRESULT CRecognizer::get_ProgId(BSTR * ProgId)
    {
        // Set the ProgID of the Recognizer interface.
        *ProgId = SysAllocString(L"MessengerSmartTag.Recognizer");
        return S_OK;
    }
    
    HRESULT CRecognizer::get_Name(INT LocaleID, BSTR * Name)
    {
        // Set a short title about the recognizer.
        *Name = SysAllocString(L"Microsoft Messenger Contacts Visual C++ Recognizer");
        return S_OK;
    }
    
    HRESULT CRecognizer::get_Desc(INT LocaleID, BSTR * Desc)
    {
        // Set a long description of the recognizer.
        *Desc = SysAllocString(L"Microsoft Messenger recognizes your Instant Messenger Contacts");
        return S_OK;
    }
    
    HRESULT CRecognizer::get_SmartTagCount(INT * Count)
    {
        // Set the number of Smart Tags that are supported.
        *Count = 1;
        return S_OK;
    }
    
    HRESULT CRecognizer::get_SmartTagName(INT SmartTagID, BSTR * Name)
    {
        // This method is called the same number of times as you
        // return in SmartTagCount. This method sets a unique name
        // for the Smart Tag.
        *Name = SysAllocString(L"microsoft/messenger#contacts");
        return S_OK;
    }
    
    HRESULT CRecognizer::get_SmartTagDownloadURL(INT SmartTagID, BSTR * DownloadURL)
    {
        // Set the URL that gets embedded in documents.
        *DownloadURL = NULL;
        return S_OK;
    }
    
    HRESULT CRecognizer::Recognize(BSTR Text, IF_TYPE DataType, INT LocaleID,
           ISmartTagRecognizerSite * RecognizerSite)
    {
        // The Recognize method is called and passed a text value.
        // You should recognize strings in the text and set up the actions.
        WCHAR *pch, *strText = _wcslwr(Text);
        ISmartTagProperties  *pSmartTagProp = NULL;
        long rgIndices[1];
        HRESULT hr;
    
        // Look through all contacts
        for (long l = 0; l<lCount; l++).
        {
            rgIndices[0] = l;
    
            // Get the contact name.
            _variant_t v;
            hr = SafeArrayGetElement(psa,rgIndices,&v);
            // Convert the VARIANT to a BSTR.
            _bstr_t bstrContact = v;
            // Loop through the string looking for contacts.
            for (pch = strText; (pch = wcsstr(pch, bstrContact))!=NULL; pch++)
            {    
                // Create a new property bag.
                hr = RecognizerSite->GetNewPropertyBag(&pSmartTagProp);
                if (SUCCEEDED(hr)) {
                    // Commit the Smart Tag to the property bag.		                hr = RecognizerSite->CommitSmartTag(
                          _bstr_t("microsoft/messenger#contacts"),
                          pch - strText+1, wcslen(bstrContact),
                          pSmartTagProp);
                    
                    if (pSmartTagProp != NULL)
                        pSmartTagProp->Release();
                }
            }
        }
        return S_OK;
    }
  9. Aprire il file Action.h e sostituire il contenuto della classe con il seguente codice:
    ///////////////////////////////////////////////////////////////////////////// 
    // CAction
    class 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()
    
    // IAction
    public:
    // 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. Aprire il file Action.cpp e aggiungere il seguente codice alla fine del file:
    HRESULT CAction::get_ProgId(BSTR * ProgId)
    {
       // Set the ProgID of the Action interface.
       *ProgId = SysAllocString(L"MessengerSmartTag.Action");
       return S_OK;
    }
    
    HRESULT CAction::get_Name(INT LocaleID, BSTR * Name)
    {
       // Set a short name describing the Action.
       *Name = SysAllocString(L"Messenger Smart Tag");
       return S_OK;
    }
    
    HRESULT CAction::get_Desc(INT LocaleID, BSTR * Desc)
    {
       // Set a long description describing the action.
       *Desc = SysAllocString(L"Provides actions for the Messenger Smart Tag");
       return S_OK;
    }
    
    HRESULT CAction::get_SmartTagCount(INT * Count)
    {
        // Set the number of smart tags this action supports.
        *Count = 1;
        return S_OK;
    }
    
    HRESULT CAction::get_SmartTagName(INT SmartTagID, BSTR * Name)
    {
        // This method is called the same number of times as you
        // return in SmartTagCount. This method sets a unique name
        // for the smart tag.
        *Name = SysAllocString(L"microsoft/messenger#contacts");
        return S_OK;
    }
    
    HRESULT CAction::get_SmartTagCaption(INT SmartTagID, INT LocaleID, BSTR * Caption)
    {
        // This caption is displayed on the menu for the smart tag.
        *Caption = SysAllocString(L"Messenger Smart Tag");
        return S_OK;
    }
    
    HRESULT CAction::get_VerbCount(BSTR SmartTagName, INT * Count)
    {
        // Return the number of verbs we support.
        if (wcsstr(SmartTagName,L"microsoft/messenger#contacts") != 0) {
            *Count = 2;
        }
        return S_OK;
    }
    
    HRESULT CAction::get_VerbID(BSTR SmartTagName, INT VerbIndex, INT * VerbID)
    {
        // Return a unique ID for each verb we support.
        *VerbID = VerbIndex;
        return S_OK;
    }
    
    HRESULT CAction::get_VerbCaptionFromID(INT VerbID, BSTR ApplicationName,
                         INT LocaleID, BSTR * Caption)
    {
        // Set a caption for each verb. This caption is displayed
        // on the Smart Tag menu.
        switch (VerbID) {
          case 1:
            *Caption = SysAllocString(L"Send this contact an Instant Message");
            break;
          case 2:
            *Caption = SysAllocString(L"Send email to this contact");
            break;
          default:
            *Caption = NULL;
            break;
        }
        return S_OK;
    }
    
    HRESULT CAction::get_VerbNameFromID(INT VerbID, BSTR * Name)
    {
        // Set a string name for each verb.
        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)
    {
        // This method is called when a user invokes a verb
        // from the Smart Tag menu.
        Messenger::IMessengerApp2Ptr oMessenger = NULL;
        Messenger::IMsgrObject2Ptr oMsgrObj = NULL;
        Messenger::IMsgrUsersPtr oUsers = NULL;
        Messenger::IMsgrUserPtr oUser = NULL;
        _variant_t v;		
    
        // Create an instance of Instant Messenger.
        oMessenger.CreateInstance("Messenger.MessengerApp");
        oMsgrObj.CreateInstance("Messenger.MsgrObject");
        // Get a list of contacts.
        oUsers = oMsgrObj->GetList(Messenger::MLIST_CONTACT);
        // Loop through all contacts.
        for (long l=0; l<(oUsers->GetCount()-1); l++)
        {
            // Get a specific contact.
            oUser = oUsers->Item(l);
            // Check to see if the contact is the correct one.
    	if (wcscmp(_wcslwr(oUser->GetFriendlyName()),_wcslwr(Text)) == 0)
            {
                switch (VerbID) {
                  case 1:
                    // The user wants to display the Instant Message
                    // box to send the contact a message.
                    v = oUser.GetInterfacePtr();					
                    oMessenger->LaunchIMUI(v);
                    break;
                  case 2:
                    // Shell the "mailto" protocol to start the
                    // user's mail program and create a new message.
                    _bstr_t bstrTemp = "mailto:";
                    bstrTemp += oUser->GetEmailAddress();				                ShellExecute(0,"open",bstrTemp,NULL,NULL,1);
                    break;
                }
            }
        }
        return S_OK;
    }
  11. Aprire il file Stdafx.h e aggiungere il seguente codice dopo la riga #include <atlcom.h>:
    #import "C:\Program Files\Messenger\msmsgs.exe"
    NOTA: cambiare il percorso del file Msmsgs.exe in modo che corrisponda al punto di installazione di Messaggistica istantanea. Il percorso predefinito di Messaggistica istantanea Ŕ C:\Programmi\Messenger.
  12. Premere F7 per creare la DLL.




Procedura per la registrazione della DLL Smart tag



Per utilizzare la DLL Smart tag Ŕ necessario registrarla prima nel sistema. La normale registrazione COM viene effettuata automaticamente quando si compila il progetto o si richiama Regsvr32.exe con il nome della DLL. Per consentire alle applicazioni di Office di identificare la DLL come DLL Smart tag, Ŕ necessario creare ulteriori voci di registro che non fanno parte della normale registrazione COM. Per eseguire questa operazione, attenersi alla seguente procedura:
  1. Da una riga di comando avviare Regedit.exe.
  2. In HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Actions aggiungere una nuova sottochiave denominata MessengerSmartTag.Action.
  3. In HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart Tag\Recognize aggiungere una nuova sottochiave denominata MessengerSmartTag.Recognize.
  4. Chiudere l'Editor del Registro di sistema.




Procedura per il test della DLL Smart tag



Gli smart tag seguono lo stesso modello di protezione applicato alle macro. Se la protezione dell'applicazione Ŕ impostata su Alta, la DLL Smart tag non verrÓ caricata a meno che non sia contrassegnata con firma digitale, come per le macro VBA. Per ulteriori informazioni sulle firme digitali, consultare la sezione "Riferimenti".

Per eseguire il test della DLL Smart tag di riconoscimento/azioni in Word, attenersi alla seguente procedura:
  1. Avviare Messaggistica istantanea ed eseguire l'accesso.

    NOTA: lo smart tag di esempio richiede l'esecuzione dell'accesso a Messaggistica istantanea. Se non si esegue questa operazione, la DLL personalizzata verrÓ caricata ma non riconoscerÓ i contatti.
  2. Avviare Word 2002. Dal menu Strumenti scegliere Macro e fare clic su Protezione. Impostare la protezione per le macro su Media e scegliere OK. Se il livello di protezione delle macro in precedenza era impostato su Alta, riavviare Word.
  3. Digitare il nome del contatto in un nuovo documento, ad esempio Giovanni Giudici, e premere INVIO. Sotto al nome viene visualizzata una sottile linea per indicare che Ŕ stato riconosciuto come smart tag. Spostare il mouse sul nome per visualizzare il pulsante Azioni smart tag.
  4. Fare clic su Azioni smart tag e selezionare una delle azioni personalizzate dal menu a discesa. ╚ possibile inviare un messaggio di posta elettronica o un messaggio istantaneo al contatto dal nuovo documento.
Una procedura simile pu˛ essere utilizzata per eseguire il test della DLL smart tag in Excel 2002.





Risoluzione dei problemi



Nel caso di problemi di funzionamento degli smart tag personalizzati, assicurarsi innanzitutto che la DLL Smart tag venga caricata. In Word o in Excel dal menu Strumenti scegliere Opzioni correzione automatica, fare clic sulla scheda Smart tag e assicurarsi che l'opzione Contrassegna testo con smart tag sia selezionata e che la DLL Smart tag sia elencata e selezionata. In caso contrario, Ŕ possibile che non sia registrata correttamente.

Se l'esecuzione della classe personalizzata recognizer o action rappresenta la causa del problema, Ŕ possibile eseguire il debug della DLL Smart tag seguendo la stessa procedura utilizzata per una DLL Visual C++. Definire un punto di interruzione nel costruttore per la classe Recognizer. Quando si preme F5 per eseguire il debug dell'applicazione, viene visualizzata una finestra di dialogo nella quale viene chiesto un file eseguibile per la sessione di debug. Selezionare Winword.exe oppure Excel.exe. Quando viene avviato Excel o Word e viene caricata la DLL Smart tag, il codice si interromperÓ in corrispondenza del punto di interruzione e sarÓ possibile procedere un'istruzione alla volta per il debug del codice.



RIFERIMENTI


La documentazione relativa a queste interfacce e la libreria dei tipi necessaria per definirle vengono fornite con Smart Tag Software Development Kit (SDK). Se ancora non Ŕ installato, procedere all'installazione di Smart Tag SDK prima di eseguire la procedura per creare lo smart tag di esempio. Smart Tag SDK Ŕ disponibile sul CD di Microsoft Office XP Developer (MOD) oppure Ŕ possibile scaricarlo dal sito Web Microsoft Developer Network (MSDN) al seguente indirizzo (informazioni in lingua inglese):
Smart Tag Software Development Kit
http://www.microsoft.com/downloads/details.aspx?familyid=3d8edcee-0246-43ef-a70f-94c0899f1e8f&displaylang=en



Per ulteriori informazioni sulla creazione di DLL Smart tag di riconoscimento/azioni personalizzate, vedere il file della Guida in linea di Smart Tag Development incluso in Smart Tag SDK.

Per ulteriori informazioni sulle firme digitali, fare clic sul numero dell'articolo della Knowledge Base riportato di seguito (gli articoli con prefisso "Q" contengono informazioni in inglese):
247257 INFO: Steps for Signing a .cab File
Per ulteriori informazioni sull'utilizzo di CLSID anzichÚ di ProgID per registrare la DLL Smart tag, vedere il seguente articolo della Microsoft Knowledge Base (gli articoli con prefisso "Q" contengono informazioni in inglese):
294422 BUG: Status Flag Is Not Updated When You Enable or Disable Smart Tags




ProprietÓ

Identificativo articolo: 292596 - Ultima modifica: lunedý 24 febbraio 2014 - Revisione: 7.1
Le informazioni in questo articolo si applicano a
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
Chiavi:á
kbnosurvey kbarchive kbatl kbgrpdso kbhowtomaster KB292596
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com