如何读取outlook express分组以及分组关联的联系人,以及如何设置分组、新增分组的联系人?
网上是说分组信息是在IDistList里面,关键是如何通过分组找到分组对应的联系人?
最好有源码说明下。

解决方案 »

  1.   

    void Export()
    {
    HRESULT                 hr = S_OK;
    LPADRBOOK               lpAddrbk = NULL;
    ULONG                   ulObjType = NULL;
    LPSPropValue            lpProp;
    LPABCONT                lpABC = NULL;
    LPMAPIPROP              lpNewPABEntry = NULL; LPSPropProblemArray     lpPropProblems = NULL; HRESULT hRes;
    LPWABOBJECT lpWABObject;
    LPWAB_PARAM lpWABParam = NULL;
    DWORD Reserved2 = NULL;

    HINSTANCE hinstLib;
    hinstLib = LoadLibrary("c:\\Program Files\\Common Files\\System\\wab32.dll");
    LPWABOPEN procWABOpen;

    ULONG ulcValues = 0;
    LPSPropValue lpPropArray = NULL;
    int i;
    if (hinstLib != NULL)
    {
    // 获取"Wab32.dll"内部涵数WABOpen的进程地址
    procWABOpen = (LPWABOPEN) GetProcAddress(hinstLib, "WABOpen"); 

    if (procWABOpen != NULL)
    {
    hRes = (procWABOpen)(&lpAddrbk,&lpWABObject,NULL,Reserved2);
    if (hRes != S_OK) exit(1);
    }
    } // 得到PAB根容器
        // 
    SBinary pabEID;
    hr = lpAddrbk -> GetPAB(&pabEID.cb, (LPENTRYID *)&pabEID.lpb);
    if (FAILED(hr))   goto Cleanup; hr = lpAddrbk->OpenEntry(pabEID.cb,   // 打开记录的大小
                            (ENTRYID*)pabEID.lpb,  // 记录的ID
                             NULL,        // 接口NULL
                             MAPI_MODIFY, // 标志
                             &ulObjType,
                             (LPUNKNOWN FAR *)&lpABC);
    if (FAILED(hr))   goto Cleanup;  hr = lpABC->GetProps(NULL, 0, &ulcValues, &lpPropArray );
      if (FAILED(hr))   goto Cleanup;
      for (i=0; i<ulcValues;i++)
      {
      if (lpPropArray[i].ulPropTag == PR_DEF_CREATE_DL)
      {
      lpProp = new SPropValue;
      lpProp->dwAlignPad = lpPropArray[i].dwAlignPad;
      lpProp->ulPropTag = lpPropArray[i].ulPropTag;
      lpProp->Value = lpPropArray[i].Value;
      break;
      }
      }
    //创建一个分组
    hr = lpABC->CreateEntry(lpProp->Value.bin.cb,
                           (ENTRYID*)lpProp->Value.bin.lpb,
                           CREATE_CHECK_DUP_LOOSE,
                           &lpNewPABEntry);
    if (FAILED(hr))   goto Cleanup; SPropValue  pPropsMesg[1];
    ZeroMemory( pPropsMesg, sizeof(SPropValue)); pPropsMesg[0].dwAlignPad        = 0;
    pPropsMesg[0].ulPropTag         = PR_DISPLAY_NAME;
    pPropsMesg[0].Value.LPSZ        = "abcd";  //设置分组属性为1个,并把属性结构传入参数
    hr = lpNewPABEntry->SetProps(1, pPropsMesg, &lpPropProblems);
    if (FAILED(hr))   goto Cleanup; // 如果你不调用SaveChanges方法,所做的修改不会被保存
    // 正如你如果打开不用MAPI_MODIFY标志,那么会产生访问
    // 违例错误
        // 
    hr = lpNewPABEntry->SaveChanges(NULL);
    if (FAILED(hr))   goto Cleanup;Cleanup:
    if (lpNewPABEntry) lpNewPABEntry->Release();
    if (lpABC) lpABC->Release(); if (lpAddrbk) lpAddrbk->Release();
    }
      

  2.   

    这个东东太偏门了一个分组会有多个联系人,所有联系人的ENTRYID都保存在这个分组的PR_CHILD_ENTRYID属性中,在这个属性里面添加联系人的ENTRYID,记得它是以MultiValuesBinary方式保存的。做到这点所需的代码还不少,慢慢啃吧
      

  3.   

    楼上的,你这个PR_CHILD_ENTRYID属性哪来的,WABTAGS.H里面根本没有这个属性.
      

  4.   

    SORRY,一不小心看错了,PR_CHILD_ENTRYID是我自定义的一个属性,上面当我没说。时间太久远,代码也很复杂,依稀记得OE好像没有分组特性,懒得再去看代码了。