如何导入outlook联系人?
现在可以导入outlook联系人,但是outlook分组中的联系人读不出来,并且分组后面建立的所有联系人读不出来!
即没有分组的时候都可以读出来!
问题:如何读出outlook中,各个分组的联系人!

解决方案 »

  1.   

    http://www.vckbase.net/document/viewdoc/?id=660
      

  2.   

    An excellant post in codeguru.
    Import address book from OE
    Some of this code is EXTREMELY complicated to say the very least. Good luck.
    You will need to include:
    #include "mapix.h"
    #include "addrlkup.h"
    First call the GETMSExchangeUSers() function seen below:
    void CMAPITestDlg::GetMSExchangeUsers(CStringList &NameList)
    {
    CString cst;
    HRESULT hr = ::MAPIInitialize(NULL);
    ASSERT(S_OK == hr);
    LPMAPISESSION pSession = NULL;
    hr = ::MAPILogonEx(0, NULL, NULL, MAPI_LOGON_UI | MAPI_ALLOW_OTHERS | MAPI_EXTENDED, &pSession);
    ASSERT(SUCCEEDED(hr));
    LPADRBOOK lpAdrBook = NULL;
    hr = pSession->OpenAddressBook(0, 0, MAPI_ACCESS_MODIFY, &lpAdrBook);
    ASSERT(SUCCEEDED(hr));
    ULONG cbeid = 0;
    LPENTRYID peid = NULL;
    hr = HrFindExchangeGlobalAddressList(lpAdrBook, &cbeid, &peid);
    if (SUCCEEDED(hr))
    {
    ULONG openFlags = MAPI_BEST_ACCESS;
    hr = lpAdrBook->OpenEntry(cbeid, peid, NULL, openFlags, &ulObjType, (LPUNKNOWN *)&dlpPABEntry);
    if (hr ==S_OK)
    {
    SizedSPropTagArray(2, sptStoTbl) = {2, {PR_DISPLAY_NAME, PR_EMS_AB_PROXY_ADDRESSES}};
    if (HR_SUCCEEDED(((LPABCONT)dlpPABEntry)->GetContentsTable(0L, &lppabcont)))
    {
    if (HR_SUCCEEDED(lppabcont->SetColumns((LPSPropTagArray)&sptStoTbl, TBL_BATCH)))
    {
    hr = ((LPMAPITABLE)lppabcont)->GetRowCount(0, &lpulCount);
    int x = 0;
    int iTotNum = lpulCount;
    int num_iterations = (lpulCount / 50);
    int num_left = (lpulCount - (num_iterations * 50));
    m_Count = lpulCount;
    while (x < num_iterations)
    {
    if (HR_SUCCEEDED(((LPMAPITABLE)lppabcont)->QueryRows((LONG)lpulCount, 0, &lprws)))
    {
    for (int i = 0; i < (int)(*lprws).cRows; i++)
    {
    CString stro, addr, ListElement;
    stro.Format("%s", lprws->aRow.lpProps[0].Value.lpszA);
    ListElement = stro;
    if (IsItValid(stro) == 1)
    {
    ++cntr;
    ++m_MostRecentCount;
    cst.Format("%d", cntr);
    NameList.AddTail(ListElement);
    CString ice;
    ice.Format("%d of %d", cntr, iTotNum);
    SetDlgItemText(IDC_NUM, ice);
    }
    }
    }
    ++x;
    }
    if (HR_SUCCEEDED(((LPMAPITABLE)lppabcont)->QueryRows((LONG)lpulCount, 0, &lprws)))
    {
    for (int i = 0; i < num_left; i++)
    {
    CString stro, addr, ListElement;
    stro.Format("%s", lprws->aRow.lpProps[0].Value.lpszA);
    ListElement = stro;
    if (IsItValid(stro) == 1)
    {
    ++cntr;
    ++m_MostRecentCount;
    cst.Format("%d", cntr);
    NameList.AddTail(ListElement);
    }
    }
    }
    }
    }
    }
    }
    else
    {
    AfxMessageBox("Error...");
    }
    if (peid)
    {
    ::MAPIFreeBuffer(peid);
    }
    if (lpAdrBook)
    {
    lpAdrBook->Release();
    }
    ::MAPIUninitialize();
    }
      

  3.   

    vcmute(横秋) ( )   好多变量没声名,msdn都没找到这些方法!
    能不能把链接贴给我
      

  4.   

    http://www.vckbase.net/document/viewdoc/?id=660的例子进行如下修改可以达到你的要求
    我的outlook是2003
    #import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" named_guids
    #import "C:\Program Files\Microsoft Office\OFFICE11\MSOUTL.olb" \
    no_namespace exclude("_IRecipientControl", "_DRecipientControl")
    ......
       _ApplicationPtr pApp;

    HRESULT hr; m_ListEmail.ResetContent();
    try
    {
    hr=pApp.CreateInstance(__uuidof(Application));
    if (FAILED(hr))
    {
    AfxMessageBox("Outlook实例创建失败");
    return 1;
    } // 获取默认Outlook中联系人文件夹 MAPIFolderPtr pFolder = pApp->GetNamespace(_bstr_t("MAPI"))->GetDefaultFolder(olFolderContacts);
    _FoldersPtr pFolders;
    while (pFolder)
    {
    _ItemsPtr pItems;
    _ContactItemPtr pContact;
    pItems=pFolder->GetItems();
    if (pItems==NULL)
    {
    AfxMessageBox("不能得到联系人条目");
    return 1;
    }

    pContact=pItems->GetFirst();
    while(pContact)
    {
    CString strTemp;
    strTemp=(char *)pContact->GetFullName();
    strTemp=strTemp + "<";
    strTemp=strTemp + (char *)pContact->GetEmail1Address();
    strTemp=strTemp + ">";
    m_ListEmail.AddString(strTemp); pContact=pItems->GetNext();
    }
    pFolders = pFolder->GetFolders();
    if (pFolders)
    pFolder = pFolders->GetFirst();
    }
    }
    catch(_com_error &e)
    {
    AfxMessageBox((char *)e.Description());
    }
    ......
    I don't know why  似乎GetFolders是取下一个
      

  5.   

    唉!还是不行,我的也是outlook2003
      

  6.   

    to platinum15 (心碎便便) 
    我昨晚在我的机器上试过,没问题啊?!你自己试过么