2013-03-28 2 views
0

Nous utilisons Object Model Outlook comme suit pour lire tous les contacts Outlook:Comment désactiver pop-up de sécurité Outlook en utilisant Outlook Object Model C++

  • Object Model Outlook
  • Microsoft Office 2010 64 bits
  • Windows 7 ultime

    #import "mso.dll" named_guids 
    #import "msoutl.olb" no_namespace 
    ... 
    ... 
    void OutlookFeaturesImpl::getContactsFromOutlook() 
    { 
     _NameSpacePtr pNameSpace = m_ApplicationPtr->GetNamespace(_bstr_t("MAPI")); 
     .... 
     MAPIFolderPtr pFolder = pNameSpace->GetDefaultFolder(olFolderContacts); 
     if(pFolder) 
     { 
      .... 
      _ItemsPtr pItems = pFolder->GetItems(); 
      .... 
      _ContactItemPtr contact = pItems->Find(bstrFilter); 
      if(contact) 
      { 
       collectContactDetails(contact) 
      } 
     } 
    } 

    void OutlookFeaturesImpl::collectContactDetails(_ContactItemPtr pContact) 
    { 
     // The following 2 lines work fine. No Outlook security popup. 
     _bstr_t bstrFirstName = pContact->GetFirstName(); 
     _bstr_t bstrLastName = pContact->GetLastName(); 

     // The following calls to get Email address and Properties trigger the Outlooks' security prompt since they are part of the "Outlook security object model guard" as you may see from this link: 
     // http://www.vbforums.com/showthread.php?402086-FAQ-s-OD-Why-do-I-get-an-Outlook-Security-Prompt 
     _bstr_t emailAddType = pContact->GetEmail1AddressType(); 
     _bstr_t bstrEmailAddress = pContact->GetEmail1Address(); 
     _PropertyAccessorPtr p = pContact->GetPropertyAccessor(); 
    } 

Pour se débarrasser du message contextuel de sécurité Outlook, j'ai trouvé une solution sur interne t comme suit:


    void OutlookFeaturesImpl::collectContactDetails(_ContactItemPtr pContact) 
    { 
     CComQIPtr pIMessage; 
     // we should use late binding when calling GetMAPIOBJECT() 
     CComQIPtr pIDispatch(pContact); 
     OLECHAR FAR* szMember = L"MAPIOBJECT"; 
     DISPID dispID; 
     hr = pIDispatch->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispID); 
     if(SUCCEEDED(hr)) 
     { 
      DISPPARAMS params = {0, 0, 0, 0}; 
      params.cArgs = 0; 
      _variant_t varResult; 

      hr = pIDispatch->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL); 
      if(SUCCEEDED(hr)) 
      { 
       pIMessage = varResult; // pIMessage will be NULL after this assignment 
      } 
     } 

     if(pIMessage) // It is NULL and hence does not go inside 
     { 
      LPSPropTagArray lpNamedPropTags = NULL; 
      MAPINAMEID NamedID = {0}; 
      LPMAPINAMEID lpNamedID = &NamedID; 
      NamedID.lpguid = (LPGUID)&PSETID_Address; 
      NamedID.ulKind = MNID_ID; 
      NamedID.Kind.lID = dispidEmailOriginalDisplayName; 

      hr = pIMessage->GetIDsFromNames(1, &lpNamedID, NULL, &lpNamedPropTags); 

      if (SUCCEEDED(hr) && lpNamedPropTags) 
      { 
       SPropValue* pPropValue = NULL; 
       SPropTagArray sPropTagArray; 
       sPropTagArray.cValues = 1; 
       sPropTagArray.aulPropTag[0] = CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[0],PT_STRING8); 
       ULONG cProps = 0; 

       hr = pIMessage->GetProps(&sPropTagArray, NULL, &cProps, &pPropValue); 

       if (SUCCEEDED(hr) && 1 == cProps && pPropValue && PT_STRING8 == PROP_TYPE(pPropValue[0].ulPropTag) && pPropValue[0].Value.lpszA) 
       { 
        _bstr_t bstrEmail1Address = pPropValue->Value.lpszA; 
       } 
      } 
     } 
    } 

NOTE: Ce sont les chaînes magiques utilisées dans le code ci-dessus:


    #define dispidEmailOriginalDisplayName 0x8084 
    const GUID PSETID_Address = {0x00062004, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; 

La question est de savoir quoi utiliser avec le modèle d'objet Outlook avec notre code existant (qui est montré ci-dessus dans les blocs de code) pour éviter la fenêtre de sécurité Outlook.

Veuillez également vérifier nos constatations dans les commentaires figurant dans ces blocs de code.

Répondre

0

Jetez un oeil à un contact avec OutlookSpy - cliquez sur le bouton iMessage, regardez les propriétés que vous essayez de récupérer.

Lorsque vous appelez GetProps, PR_GIVEN_NAME et PR_SURNAME peuvent être codées en dur (ceux-ci ne sont pas des propriétés nommées). Pour Email1AddressType et Email1Address, vous devez utiliser les identificateurs GUID appropriés et les ids affichés par OutlookSpy pour déterminer d'abord les balises de propriété (en utilisant GetIDsFromNames).

+0

Merci Dmitry pour votre réponse. En fait, il échoue ici, pIMessage est NULL et je ne peux pas aller plus loin si: hr = pIDispatch-> Invoke (dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, & params, & varResult, NULL, NULL); if (SUCCEEDED (hr)) { pIMessage = varRésultat; // pIMessage sera NULL après cette affectation } –

+0

Désolé pour les commentaires ratés. J'ai du mal à formater le code dans le commentaire. Mais j'espère que vous avez compris. Merci. –

+0

Si votre code s'exécute en dehors de l'espace de processus outlook.exe ou sur un thread secondaire, vous devez initialiser MAPI avant d'effectuer des appels liés à MAPI, y compris QI pour IMessage. Appellez-vous MAPIInitialize n'importe où dans votre code? –

Questions connexes