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

转载 2006年06月22日 11:02:00

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

扩展Outlook 用户显示信息!

今天接到一个朋友的一个问题,谈到客户希望在Outlook 中显示出自定义的某个字段,来达到扩展当前Outlook 显示相关信息目的。 默认的Outlook 显示用户信息如下:   如果我想在...

[C#学习笔记]获取当前系统的基本信息

获取系统的当前信息主要使用的"SystemInfomation" 和 "Environment",这里只是拉出来了一些常见的信息,还可以通过其他获取更多的信息,还有兴趣的可以试一下. 我使用的Winf...
  • sxd125
  • sxd125
  • 2015年06月28日 16:08
  • 1785

天启地址簿 2.0.0001

  • 2007年10月31日 15:59
  • 891KB
  • 下载

地址簿

  • 2006年03月16日 00:00
  • 343KB
  • 下载

AddressBook 地址簿  (电话簿) 访问与修改-IOS开发

访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数。管理地址簿中条目的基类对象是 ABRecord。一个 ABRecord 可以表示一个人 或者一个群体 ABG...
  • iukey
  • iukey
  • 2012年03月12日 09:59
  • 17877

BBerIPD地址簿加缩写

  • 2011年01月26日 08:00
  • 20KB
  • 下载

java地址簿管理程序

  • 2017年10月28日 22:57
  • 4KB
  • 下载

python编程:电话簿TeleAddressBook和邮箱地址簿EmailAddressBook两个文件,合并为一个完整的AddressBook文件

有电话簿TeleAddressBook和邮箱地址簿EmailAddressBook两个文件,使用字典结构将其合并为一个完整的AddressBook文件 。 变为: 代码如下: ...
  • Homewm
  • Homewm
  • 2017年10月26日 08:19
  • 126

C#地址簿软件

  • 2011年12月09日 14:49
  • 316KB
  • 下载

用户自定义控件 地址簿控件 c#

  • 2010年05月19日 21:53
  • 207KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获得outlook Express地址簿的文件夹名
举报原因:
原因补充:

(最多只允许输入30个字)