2013-03-28 41 views
0

我們使用的是Outlook對象模型如下閱讀所有Outlook聯繫人禁用Outlook安全彈出:如何使用Outlook對象模型C++

  • Outlook對象模型
  • 微軟Office 2010的64位
  • 的Windows 7終極

    #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(); 
    } 

爲了擺脫Outlook安全彈出消息中,我發現了一些實習醫生解決方案T作爲如下:


    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; 
       } 
      } 
     } 
    } 

注意:這些是在上面的代碼中使用魔法字符串:


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

問題是與Outlook對象模型用什麼與我們現有的代碼(如圖以上代碼塊)來避免Outlook安全彈出。

請檢查我們在這些代碼塊內的評論中的發現。

回答

0

查看與OutlookSpy的聯繫 - 單擊IMessage按鈕,查看您嘗試檢索的屬性。

當調用GetProp時,可以對PR_GIVEN_NAME和PR_SURNAME進行硬編碼(這些不是命名屬性)。對於Email1AddressType和Email1Address,您將需要使用OutlookSpy顯示的相應GUID和ID來首先確定屬性標記(使用GetIDsFromNames)。

+0

感謝德米特里爲您解答。實際上它有點失敗,pIMessage爲NULL,如果條件爲: hr = pIDispatch-> Invoke(dispID,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&params,&varResult,NULL,NULL); (成功(小時)) pIMessage = varResult; //在此作業之後,pIMessage將爲NULL } –

+0

對不起,我已經搞亂了評論。我發現很難在評論中格式化代碼。但我希望你明白我的觀點。謝謝。 –

+0

如果您的代碼在outlook.exe進程空間或輔助線程之外運行,則必須在進行任何與MAPI相關的調用(包括用於IMessage的調用)之前初始化MAPI。您是否在代碼中的任何位置調用MAPIInitialize? –

相關問題