2016-04-15 14 views
-3
<b>Here's a high level logic used, to retrieve Personal Contacts. -- Note for simplicity, we've removed error handling and Object releases.</b> 

<!-- getOutlookStyleContactList() -- Try fetching contact entries for Global or Personal conatcs --> 

- > // getOutlookStyleContactList INT getOutlookStyleContactList(BOOL fetchGlobal) {IMAPISession-> OpenAddressBook(0、NULL、AB_NO_DIALOG、& pAddressBook)。 pAddressBook-> GetSearchPath(NULL、& pRows);MAPIを使用してOutlookの連絡先を取得しようとしています。ただし、電子メールアドレスの連絡先だけが返されます。誰でも私が間違っていることを知っていますか?

 // Loop through the rows and find the one for the GAL 
     // and the one for the PAB. 
     for (i = 0; i < pRows->cRows; i++) 
     { 
      SRow* folder_row = &pRows->aRow[i]; 
      LPSPropValue lpDN_cont = PpropFindProp(folder_row->lpProps,folder_row->cValues,PR_ENTRYID); 
      _PV* ContainerEntryId = NULL; 
      ContainerEntryId = &lpDN_cont->Value; 

      //Tries seraching for Global and Personal Conacts 
      BOOL bFound = false; 
      for (j = 0; j < pRows->aRow[i].cValues; j++) 
      { 
       if (pRows->aRow[i].lpProps[j].ulPropTag == PR_DISPLAY_TYPE) 
       { 
        if (pRows->aRow[i].lpProps[j].Value.ul == DT_GLOBAL) 
        { 
         if (fetchGlobal) 
         { 
          bFound = true; 
         } 
        } 
       } 

       if (pRows->aRow[i].lpProps[j].ulPropTag == PR_DISPLAY_NAME) 
       { 
        if (checkForGlobal(pRows->aRow[i].lpProps[j].Value.lpszA)) 
        { 
         if (fetchGlobal) 
         { 
          bFound = true; 
         } 
        } 
        else 
        { 
         if (!fetchGlobal) 
         { 
          bFound = true; 
         } 
        } 
       } 
      } 
      //A folder was found. Now read all ontact contents from folder 
      if (bFound) 
      { 
       readContainerContents(pAddressBook, ContainerEntryId->bin.cb, (LPENTRYID)ContainerEntryId->bin.lpb); 
      } 
     } 
    } 

- > // readContainerContents()。指定されたフォルダから連絡先を読み取る int readContainerContents(LPADRBOOK pAddressBook、ULONG cbEntryID、LPENTRYID lpEntryID) { ULONG ulFlags = 0; ULONG ulObjType = NULL; LPUNKNOWN lpUnk = NULL; HRESULT hRes; int retArrayObj = 0; ULONG j; ULONG i;

 hRes = pAddressBook->OpenEntry(cbEntryID, lpEntryID, NULL, ulFlags, &ulObjType, &lpUnk); 

     ulFlags = NULL; 
     IABContainer *lpContainer = static_cast <IABContainer *>(lpUnk); 

     if (ulObjType != MAPI_ABCONT) 
     { 
      RELEASE(lpUnk); 
      return -1; 
     } 

     LPMAPITABLE lpTable = NULL; 

     ULONG ulContentFlag = 0; 
     hRes = lpContainer->GetContentsTable(ulContentFlag, &lpTable); 

     uint32_t total_entries = 0; 
     uint32_t cur_entry = 0; 

     //Loop through retrieved contact entries 
     while (1) 
     { 
      SRowSet *lpRows = NULL; 
      hRes = lpTable->QueryRows(50, 0, &lpRows); 

      if ((hRes != S_OK) || (lpRows == NULL) || (lpRows->cRows == 0)) 
      { 
       break; 
      } 
      //Run through all contact entries 
      total_entries += lpRows->cRows; 
      for(i=0;i<lpRows->cRows;i++) 
      { 
       SRow *lpRow = &lpRows->aRow[i]; 
       LPSPropValue lpDN_cont = PpropFindProp(lpRow->lpProps, lpRow->cValues, PR_ENTRYID); 
       CMAPIContact contact; 
       contact.Open(pMAPIEx, lpDN_cont->Value.bin); 
       //ADD CONTACT TO LIST 
      } 
     } 
    } 
+0

http://stackoverflow.com/editing-help –

+0

とにかくコードを挿入してください。それが座っている間、誰もその質問をすることはできません。 – user4581301

+0

私はCベースのコードを挿入するためにすべてを試して、私はコードの書式設定/インデントエラー – jlandje

答えて

0

それがどのように動作するかであること - OABが唯一のメールアドレスを持つ連絡先を公開します。すべての連絡先が必要な場合は、アドレス帳オブジェクトを使用する代わりに連絡先フォルダを開く必要があります。

OutlookSpyと連絡先フォルダとそのアイテムを見てみましょうなど、(IMsgStoreによって返さ:: GetReceiveFolder(「のIPM.Note」))受信トレイフォルダからPR_IPM_CONTACT_ENTRYIDを読むフォルダを開き、その内容のテーブルを読み込みます(IMAPIFolderとIMessageをクリックします)。

+0

ドミトリー、回答ありがとうございます。提案した方法を使用している場合は、Main Contactエントリだけが公開されます。コンタクトサブフォルダからコンタクトエントリを読み取ることができません。ありがとう – jlandje

+0

なぜあなたはできませんか?連絡先フォルダまたは他のフォルダの両方の項目に対して同じIMessageオブジェクトが取得されます。連絡先固有のプロパティを取得するだけで済みます。 OutlookSpyの連絡先を見ましたか(IMessageをクリックしますか?) –

関連する問題