WEB开发网
开发学院软件开发VC 获取本机通讯薄的内容 阅读

获取本机通讯薄的内容

 2006-07-22 11:45:17 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 简介如果你想获取本机通讯簿(Outlook Express和Outlook2000)的内容,如:联系人名字、联系人邮件地址等时,获取本机通讯薄的内容,可以试试下面的方法,下面是把此方法用VC6编写的示例程序运行效果:由于读取Outlook Express(系统自带)和Outlook20

本文示例源代码或素材下载

简介

如果你想获取本机通讯簿(Outlook Express和Outlook2000)的内容,如:联系人名字、联系人邮件地址等时,可以试试下面的方法。下面是把此方法用VC6编写的示例程序运行效果:

由于读取Outlook Express(系统自带)和Outlook2000(Office2000中所带)中通讯薄内容所采取的方法不同,下面将分开简述。

第一、读取系统自带Outlook Express中通讯薄方法

基本思路

通过载入Wab32.dll文件(此文件一般位于路径“<盘符>\Program Files\Common Files\System\”下面),再获取其内部涵数WABOpen的进程地址加以调用,来读出通讯薄中主要内容。

具体实现

一、 包含通讯薄头文件及声明内部函数

#include <wab.h>        // 通讯薄头文件
// 内部函数声明
typedef HRESULT (WINAPI *fWABOpen)(LPADRBOOK*,LPWABOBJECT*,LPWAB_PARAM,DWORD);
二、 读取具体内容的详细代码 // 读取通讯薄内容(类型、呢称、名字、EMAIL)
void CGetEmailDlg::OnOK()
{
  HRESULT hRes;
  LPADRBOOK lpAdrBook;
  LPWABOBJECT lpWABObject;
  LPWAB_PARAM lpWABParam = NULL;
  DWORD Reserved2 = NULL;
  HINSTANCE hinstLib;
  hinstLib = LoadLibrary("D:\\Program Files\\Common Files\\System\\wab32");
  fWABOpen procWABOpen;
  if (hinstLib != NULL)
  {
    // 获取"Wab32.dll"内部涵数WABOpen的进程地址
    procWABOpen = (fWABOpen) GetProcAddress(hinstLib, "WABOpen");
    if (procWABOpen != NULL)
    {
      hRes = (procWABOpen)(&lpAdrBook,&lpWABObject,NULL,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,
        lpEntryID,
        NULL,
        ulFlags,
        &ulObjType,
        &lpUnk
      );
      ulFlags = NULL;
      
      if (ulObjType == MAPI_ABCONT)
      {
        IABContainer *lpContainer = static_cast <IABContainer *>(lpUnk);
        LPMAPITABLE lpTable = NULL;
        hRes = lpContainer->GetContentsTable(
          ulFlags,
          &lpTable
        );
        _ASSERT(lpTable);
        ULONG ulRows;
        hRes = lpTable->GetRowCount(0,&ulRows);
        _ASSERTE(hRes == S_OK);
        SRowSet *lpRows;
        hRes = lpTable->QueryRows(
          ulRows,    // 获取所有行
          0,
          &lpRows
        );
        m_ListEmail.ResetContent();
        for(ULONG i=0;i<lpRows->cRows;i++)
        {
          SRow *lpRow = &lpRows->aRow[i];
          CString strTemp;
          
          for(ULONG j=0;j<lpRow->cValues;j++)
          {
            SPropValue *lpProp = &lpRow->lpProps[j];
            
            
            if (lpProp->ulPropTag == PR_DISPLAY_NAME_A)
              strTemp = strTemp + " 名字: " + (char *)lpProp->Value.lpszA;
            if (lpProp->ulPropTag == PR_EMAIL_ADDRESS_A)
              strTemp = strTemp + " Email: " + (char *)lpProp->Value.lpszA;
            if (lpProp->ulPropTag == PR_NICKNAME_A)
              strTemp = strTemp + " 呢称: " + (char *)lpProp->Value.lpszA;
            if (lpProp->ulPropTag == PR_ADDRTYPE_A)
              strTemp = strTemp + " 类型: " + (char *)lpProp->Value.lpszA;
          }
          m_ListEmail.AddString(strTemp);
          lpWABObject->FreeBuffer(lpRow);
        }
        lpWABObject->FreeBuffer(lpRows);
      }
    }
    FreeLibrary(hinstLib);
    // 读取成功后,置读取按钮无效
    CButton* pBtn = (CButton*)GetDlgItem(IDOK);
    pBtn->EnableWindow(FALSE);
  }
}
附注:在包含进头文件Wab.h进行编释时,有时会在WABTAGS.H等地方编释不通,可按示例源码中所带WABTAGS.H文件加以修改,主要是原安装文件的内容有部分损坏。 

1 2  下一页

Tags:获取 本机 通讯

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接