现在的位置: 首页 > 综合 > 正文

如何获得outlook Express地址簿的文件夹名

2012年08月02日 ⁄ 综合 ⁄ 共 3903字 ⁄ 字号 评论关闭

[Note]

1. Wab中并不在每条记录信息里保存这个文件夹名
2. IDistList并不是文件夹信息,而是分组信息。
3. 方法:先取每个文件夹的EntryID及文件夹名,再通过这个EntryID去得到这个文件夹所属的Container.再遍历Container Table得到Table中的所有记录。
4. 这个方法有个缺点,没办法读取share folder里的记录。

// 读取Outlook Express通讯薄内容(文件夹、名字、EMAIL)
void CGetEmailDlg::OnOK()
{
 HRESULT hRes;
 LPADRBOOK lpAdrBook;
 LPWABOBJECT lpWABObject;

 DWORD Reserved2 = NULL;

 HINSTANCE hinstLib;
 hinstLib = LoadLibrary("C://Program Files//Common Files//System//wab32");
 fWABOpen procWABOpen;
 WAB_PARAM wp = {0};
 wp.cbSize = sizeof(WAB_PARAM);
 
 // Only want to deal with "Main Identity's Contacts"
 wp.ulFlags = WAB_ENABLE_PROFILES; //设置这个值的话,表示只取当前的标识wab.去除share folder
 
 if (hinstLib != NULL)
 {
  // 获取"Wab32.dll"内部涵数WABOpen的进程地址
  procWABOpen = (fWABOpen) GetProcAddress(hinstLib, "WABOpen");

  if (procWABOpen != NULL)
  {
   hRes = (procWABOpen)(&lpAdrBook,&lpWABObject,&wp,Reserved2);
   _ASSERTE(hRes == S_OK);
   if (hRes != S_OK) exit(1);

   ULONG lpcbEntryID;
   ENTRYID *lpEntryID;
   hRes = lpAdrBook->GetPAB(
    &lpcbEntryID,
    &lpEntryID
   );
   

   _ASSERTE(hRes == S_OK);
   if (hRes != S_OK) exit(2);
   
   ULONG ulFlags = MAPI_BEST_ACCESS;
   ULONG ulObjType = NULL;
   LPUNKNOWN lpUnk = NULL;
   hRes = lpAdrBook->OpenEntry(
    lpcbEntryID,
    0,   //将这个值设为0的话,取得的将是wab中的所有目录。如果是设为&lpEntryID,则取得的是所有的联系人记录项
    NULL,
    ulFlags,
    &ulObjType,
    &lpUnk
   );

   ulFlags = WAB_LOCAL_CONTAINERS;  //这里ulFlags如果设为WAB_PROFILE_CONTENTS,则表示在container里获取所有的记录。造成每个folder里读取出来的记录都是全部记录 
//   ulFlags = WAB_PROFILE_CONTENTS;   
   if (ulObjType == MAPI_ABCONT)
   {
    IABContainer *lpContainer = static_cast <IABContainer *>(lpUnk);
    
    LPMAPITABLE lpTable = NULL;
    hRes = lpContainer->GetHierarchyTable(CONVENIENT_DEPTH,&lpTable);//从container中取得table,这里的table保存了文件夹信息
//    hRes = lpContainer->GetContentsTable(ulFlags,&lpTable);
    _ASSERT(lpTable);
    ULONG ulRows;
    hRes = lpTable->GetRowCount(0,&ulRows);//第1个参数为保留参数。固定为0
    _ASSERTE(hRes == S_OK);
    SRowSet *lpRows;

    hRes = lpTable->QueryRows(
     ulRows,  // 获取所有行
     0,
     &lpRows
    );

    m_ListEmail.ResetContent();
 
    SRow *lpRow = NULL;
    SPropValue *lpProp = NULL;
    BOOL bNotFolder = FALSE;
    IABContainer *lpContainer2 = NULL;
    LPENTRYID lpEID;
    ULONG cbEID;
    for(ULONG i=0;i<lpRows->cRows;i++)
    {
     bNotFolder = FALSE;
     lpRow = &lpRows->aRow[i];
     CString strTemp=_T("");
     CString strM = _T("");
     CString strFolderName = _T("");
     
     for(ULONG j=0;j<lpRow->cValues;j++)
     {
      lpProp = &lpRow->lpProps[j];
      if (lpProp->ulPropTag == PR_DISPLAY_NAME_A)
       strFolderName = strFolderName +"目录: " + (char *)lpProp->Value.lpszA;

      if (lpProp->ulPropTag == PR_ENTRYID)
      {
       lpEID = (LPENTRYID)lpProp->Value.bin.lpb;
       cbEID = lpProp->Value.bin.cb;
      }
      if (lpProp->ulPropTag == PR_DEPTH)
      {
       if(lpProp->Value.l ==0)
       {
        bNotFolder = TRUE;
        break;
       }
      }      
     }
     if(bNotFolder)
      continue;
     hRes = lpContainer->OpenEntry(
      cbEID,
      lpEID,
      NULL,
      ulFlags,
      &ulObjType,
      (LPUNKNOWN *)&lpContainer2
      );
     LPMAPITABLE lpTable2 = NULL;
     
     hRes = lpContainer2->GetContentsTable(ulFlags,&lpTable2);
     ULONG ulRows2;
     
     hRes = lpTable2->GetRowCount(0,&ulRows2);
     SRowSet *lpRows2;
     
     hRes = lpTable2->QueryRows(
      ulRows2,  // 获取所有行
      0,
      &lpRows2
      );
     for(ULONG i=0;i<lpRows2->cRows;i++)
     {
      SRow *lpRow2 = &lpRows2->aRow[i];
      CString strEmail=_T("");
      CString strName=_T("");
      for(ULONG j=0;j<lpRow2->cValues;j++)
      {
       SPropValue *lpProp2 = &lpRow2->lpProps[j];
       if (lpProp2->ulPropTag == PR_EMAIL_ADDRESS_A)
        strEmail = strEmail +" Email: " + (char *)lpProp2->Value.lpszA;
       if (lpProp2->ulPropTag == PR_DISPLAY_NAME_A)
        strName = strName +" Name: " + (char *)lpProp2->Value.lpszA;
       
      }
      strTemp = strFolderName + strName + strEmail;
      m_ListEmail.AddString(strTemp);
      lpWABObject->FreeBuffer(lpRow2);
     }
     lpWABObject->FreeBuffer(lpRows2);
     lpWABObject->FreeBuffer(lpRow);
    }
    lpWABObject->FreeBuffer(lpRows);
   }
  }
  FreeLibrary(hinstLib);
 }
}

抱歉!评论已关闭.