HRESULT hr = S_OK;</p><p>try<br />{<br />LPWABOPEN lpfnWABOpen = NULL; // Defined in Wabapi.h.<br /> HINSTANCE hInstWAB = NULL;</p><p>CRegKey regKey;</p><p>LONG nReturn = regKey.Open(HKEY_LOCAL_MACHINE, WAB_DLL_PATH_KEY, KEY_READ);<br />if(nReturn == ERROR_SUCCESS)<br />{<br />ULONG nChars = BUFFER_SIZE;<br />TCHAR szValue[BUFFER_SIZE];<br />nReturn = regKey.QueryStringValue("", szValue, &nChars);<br />regKey.Close();</p><p>if(nReturn == ERROR_SUCCESS)<br />{<br />if(lstrlen(szValue) > 0)<br />{<br />HRESULT hr = E_FAIL;<br />hInstWAB = LoadLibrary(szValue);<br />if(hInstWAB != NULL)<br />{<br />lpfnWABOpen = (LPWABOPEN) GetProcAddress(hInstWAB, "WABOpen");<br />if (lpfnWABOpen)<br />{<br />WAB_PARAM wp = {0};<br />wp.cbSize = sizeof(WAB_PARAM);<br />wp.ulFlags = WAB_ENABLE_PROFILES;<br />wp.hwnd = NULL;<br />wp.szFileName = NULL;<br />IAddrBook* pAddrBook;<br />CComPtr<IWABObject> pWabObject;</p><p>hr = lpfnWABOpen(&pAddrBook, &pWabObject, &wp, 0);<br />if(SUCCEEDED(hr))<br />{<br />ULONG cbEntryID;<br />LPENTRYID pEntryID = NULL;<br />ULONG ulObjType = NULL;</p><p>hr = pAddrBook->GetPAB(&cbEntryID, &pEntryID);<br />if(SUCCEEDED(hr))<br />{<br />CComPtr<IABContainer> pABContainer = NULL;<br />ULONG ulFlags = MAPI_BEST_ACCESS;<br />hr = pAddrBook->OpenEntry(cbEntryID, 0, NULL, ulFlags, &ulObjType, (LPUNKNOWN*)&pABContainer);<br />if(SUCCEEDED(hr))<br />{<br />CComPtr<IMAPITable> pMapiTable = NULL; </p><p>hr= pABContainer->GetHierarchyTable(CONVENIENT_DEPTH, &pMapiTable);<br />if(SUCCEEDED(hr))<br />{<br />ULONG ulCount = 0;</p><p>hr = pMapiTable->GetRowCount(0, &ulCount);<br />if(SUCCEEDED(hr))<br />{<br />LPSRowSet pRowSets = NULL;</p><p>//hr = HrQueryAllRows(pMapiTable, (SPropTagArray *)&propTagArray, NULL, NULL, ulCount, &pRowSets);<br />hr = pMapiTable->QueryRows(ulCount, 0, &pRowSets);<br />if(SUCCEEDED(hr))<br />{<br />for(int i = 0; i < pRowSets->cRows; i ++)<br />{<br />ULONG ulObjectType;<br />int nEntryIDIndex = -1;<br />DWORD dwDepth = 0;</p><p>TCHAR szFolderName[BUFFER_SIZE];<br />ZeroMemory(szFolderName, sizeof(szFolderName));</p><p>for(int j = 0; j < pRowSets->aRow[i].cValues; j ++)<br />{<br />switch(pRowSets->aRow[i].lpProps[j].ulPropTag)<br />{<br />case PR_ADDRTYPE:<br />break;<br />case PR_DISPLAY_NAME:<br />strcpy_s(szFolderName, pRowSets->aRow[i].lpProps[j].Value.lpszA);<br />break;<br />case PR_DISPLAY_TYPE:<br />break;<br />case PR_ENTRYID:<br />nEntryIDIndex = j;<br />break;<br />case PR_DEPTH:<br />dwDepth = pRowSets->aRow[i].lpProps[j].Value.l;<br />break;<br />case PR_INSTANCE_KEY:<br />break;<br />case PR_OBJECT_TYPE:<br />ulObjectType = pRowSets->aRow[i].lpProps[j].Value.l;<br />break;<br />case PR_EMAIL_ADDRESS:<br />break;<br />case PR_RECORD_KEY:<br />break;<br />case PR_NICKNAME:<br />break;<br />case PR_MOBILE_TELEPHONE_NUMBER:<br />break;</p><p>case PR_ROWID:<br />break;<br />case PR_CONTAINER_FLAGS:<br />break;<br />case PR_AB_PROVIDER_ID:<br />break;</p><p>default:<br />break;<br />}<br />}</p><p>if(ulObjectType == MAPI_FOLDER)<br />{<br />}</p><p>if((dwDepth != 0) && (nEntryIDIndex >= 0))<br />{<br />CComPtr<IABContainer> pContainer2 = NULL;<br />hr = pABContainer->OpenEntry(pRowSets->aRow[i].lpProps[nEntryIDIndex].Value.bin.cb, (LPENTRYID)pRowSets->aRow[i].lpProps[nEntryIDIndex].Value.bin.lpb, NULL,ulFlags, &ulObjType, (LPUNKNOWN *)&pContainer2);<br />if(SUCCEEDED(hr))<br />{<br />CComPtr<IMAPITable> pMapiTable2 = NULL;<br />hr = pContainer2->GetContentsTable(0x00100000/*WAB_LOCAL_CONTAINERS*/, &pMapiTable2);<br />if(SUCCEEDED(hr))<br />{<br />ULONG ulCount2;<br />pMapiTable2->GetRowCount(0, &ulCount2);</p><p>LPSRowSet pRowSets2 = NULL;<br />pMapiTable2->QueryRows(ulCount2, 0,&pRowSets2);<br />for(int i2 = 0; i2 < pRowSets2->cRows; i2 ++)<br />{<br />TCHAR szEmailAddress[BUFFER_SIZE];<br />ZeroMemory(szEmailAddress, sizeof(szEmailAddress));<br />TCHAR szDisplayName[BUFFER_SIZE];<br />ZeroMemory(szDisplayName, sizeof(szDisplayName));<br />TCHAR szMobilePhoneNumber[BUFFER_SIZE];<br />ZeroMemory(szMobilePhoneNumber, sizeof(szMobilePhoneNumber));<br />TCHAR szAddressType[BUFFER_SIZE];<br />ZeroMemory(szAddressType, sizeof(szAddressType));</p><p>ULONG ulObjectTypeCatogory = 0x00;<br />int nIndexObjectType = -1;</p><p>int nMailUserEntryIDIndex = -1;</p><p>for(int j2 = 0; j2 < pRowSets2->aRow[i2].cValues; j2 ++)<br />{<br />switch(pRowSets2->aRow[i2].lpProps[j2].ulPropTag)<br />{<br />case PR_ADDRTYPE:<br />strcpy_s(szAddressType, pRowSets2->aRow[i2].lpProps[j2].Value.lpszA);<br />break;<br />case PR_DISPLAY_NAME:<br />strcpy_s(szDisplayName, pRowSets2->aRow[i2].lpProps[j2].Value.lpszA);<br />break;<br />case PR_DISPLAY_TYPE:<br />break;<br />case PR_ENTRYID:<br />nMailUserEntryIDIndex = j2;<br />break;<br />case PR_INSTANCE_KEY:<br />break;<br />case PR_OBJECT_TYPE:<br />{<br />nIndexObjectType = j2;<br />if(pRowSets2->aRow[i2].lpProps[j2].Value.l == MAPI_MAILUSER)<br />{<br />ulObjectTypeCatogory = MAPI_MAILUSER;<br />}<br />else if(pRowSets2->aRow[i2].lpProps[j2].Value.l == MAPI_DISTLIST)<br />{<br />ulObjectTypeCatogory = MAPI_DISTLIST;<br />}<br />}<br />break;<br />case PR_EMAIL_ADDRESS:<br />strcpy_s(szEmailAddress, pRowSets2->aRow[i2].lpProps[j2].Value.lpszA);<br />break;<br />case PR_RECORD_KEY:<br />break;<br />case PR_NICKNAME:<br />break;<br />case PR_MOBILE_TELEPHONE_NUMBER:<br />strcpy_s(szMobilePhoneNumber, pRowSets2->aRow[i2].lpProps[j2].Value.lpszA);<br />break;</p><p>default:<br />break;<br />}<br />}</p><p>if(ulObjectTypeCatogory == MAPI_MAILUSER)<br />{<br />IMailUser *pMailUser = NULL;<br />IDistList *pDistList = NULL;<br />ULONG ulObjTypeMailUser = 0;</p><p>if(nMailUserEntryIDIndex != -1)<br />{<br />hr = pContainer2->OpenEntry(pRowSets2->aRow[i2].lpProps[nMailUserEntryIDIndex].Value.bin.cb,<br />(LPENTRYID)pRowSets2->aRow[i2].lpProps[nMailUserEntryIDIndex].Value.bin.lpb, NULL, MAPI_BEST_ACCESS, &ulObjTypeMailUser, (LPUNKNOWN*)&pMailUser);<br />if(SUCCEEDED(hr))<br />{<br />LPSPropTagArray lpMailUserPropTagArray;<br />ULONG ulPropertyCount;<br />LPSPropValue lpMailUserPropValueArray = NULL;</p><p>hr = pMailUser->GetProps(NULL, fMapiUnicode, &ulPropertyCount, &lpMailUserPropValueArray);<br />if(SUCCEEDED(hr))<br />{<br />if(ulPropertyCount > 0)<br />{<br />WCHAR swzEmailAddress[BUFFER_SIZE];<br />ZeroMemory(swzEmailAddress, sizeof(swzEmailAddress));</p><p>WCHAR swzDisplayName[BUFFER_SIZE];<br />ZeroMemory(swzDisplayName, sizeof(swzDisplayName));</p><p>WCHAR swzMobilePhoneNumber[BUFFER_SIZE];<br />ZeroMemory(swzMobilePhoneNumber, sizeof(swzMobilePhoneNumber));</p><p>WCHAR swzAddressType[BUFFER_SIZE];<br />ZeroMemory(swzAddressType, sizeof(swzAddressType));</p><p>LPMESSAGE pMessage = NULL;<br />IMAPIFolder * pContactFolder = NULL;</p><p>if(i == 0)<br />{<br />hr = m_pCurrentContactFolder->CreateMessage(NULL, MAPI_DEFERRED_ERRORS, &pMessage);<br />}<br />else<br />{<br />hr = m_pCurrentContactFolder->CreateFolder(FOLDER_GENERIC, szFolderName, "", &local_IID_IMAPIFolder, fMapiUnicode, &pContactFolder);</p><p>if(SUCCEEDED(hr))<br />{<br />SPropValue propFolderValue[2];<br />LPSPropProblemArray propFolderProblemArray = NULL;</p><p>propFolderValue[0].ulPropTag = PR_CONTAINER_CLASS_W;<br />propFolderValue[0].dwAlignPad = NULL;<br />propFolderValue[0].Value.lpszW = L"IPF.Contact";</p><p>// PR_EXTENDED_FOLDER_FLAGS, PidTagExtendedFolderFlags, ptagExtendedFolderFlags<br />BYTE byTempExtendFlag[] = {0x01, 0x04, 0x00, 0x00, 0x10, 0x00};<br />propFolderValue[1].dwAlignPad = NULL;<br />propFolderValue[1].ulPropTag = 0x36DA0102;<br />propFolderValue[1].Value.bin.cb = 0x00000006;<br />propFolderValue[1].Value.bin.lpb = byTempExtendFlag;</p><p>pContactFolder->SetProps(2, propFolderValue, &propFolderProblemArray);<br />pContactFolder->SaveChanges(KEEP_OPEN_READWRITE);</p><p>hr = pContactFolder->CreateMessage(NULL, MAPI_DEFERRED_ERRORS, &pMessage);<br />}<br />}</p><p>if(SUCCEEDED(hr))<br />{<br />LPSPropValue pSPpropArray = new SPropValue[11];<br />LPSPropProblemArray lpPropProblemArray = NULL;<br />pSPpropArray[0].dwAlignPad = NULL;<br />pSPpropArray[0].ulPropTag = PR_MESSAGE_CLASS_W;<br />pSPpropArray[0].Value.lpszW = L"IPM.Contact";</p><p>pSPpropArray[1].dwAlignPad = NULL;<br />pSPpropArray[1].ulPropTag = PR_MESSAGE_FLAGS;<br />pSPpropArray[1].Value.l = MSGFLAG_READ;<br />pSPpropArray[1].Value.ul = MSGFLAG_READ;</p><p>pSPpropArray[2].dwAlignPad = NULL;<br />pSPpropArray[2].ulPropTag = 0x802E001F;<br />CUtilities::MultiBytes2Unicode(swzEmailAddress, sizeof(swzEmailAddress), szEmailAddress);<br />pSPpropArray[2].Value.lpszW = swzEmailAddress;</p><p>pSPpropArray[3].dwAlignPad = NULL;<br />pSPpropArray[3].ulPropTag = 0x805B001F;<br />CUtilities::MultiBytes2Unicode(swzEmailAddress, sizeof(swzEmailAddress), szEmailAddress);<br />pSPpropArray[3].Value.lpszW = swzEmailAddress;</p><p>pSPpropArray[3].dwAlignPad = NULL;<br />pSPpropArray[3].ulPropTag = 0x805B001F;<br />CUtilities::MultiBytes2Unicode(swzEmailAddress, sizeof(swzEmailAddress), szEmailAddress);<br />pSPpropArray[3].Value.lpszW = swzEmailAddress;</p><p>pSPpropArray[4].dwAlignPad = NULL;<br />pSPpropArray[4].ulPropTag = PR_IMPORTANCE;<br />pSPpropArray[4].Value.l = IMPORTANCE_NORMAL;<br />pSPpropArray[4].Value.ul = IMPORTANCE_NORMAL;</p><p>pSPpropArray[5].dwAlignPad = NULL;<br />pSPpropArray[5].ulPropTag = PR_SUBJECT_W;<br />CUtilities::MultiBytes2Unicode(swzDisplayName, sizeof(swzDisplayName), szDisplayName);<br />pSPpropArray[5].Value.lpszW = swzDisplayName;</p><p>pSPpropArray[6].dwAlignPad = NULL;<br />pSPpropArray[6].ulPropTag = PR_DISPLAY_NAME_W;<br />CUtilities::MultiBytes2Unicode(swzDisplayName, sizeof(swzDisplayName), szDisplayName);<br />pSPpropArray[6].Value.lpszW = swzDisplayName;</p><p>pSPpropArray[7].dwAlignPad = NULL;<br />pSPpropArray[7].ulPropTag = PR_MESSAGE_FLAGS;<br />pSPpropArray[7].Value.l = 9;<br />pSPpropArray[7].Value.ul = 9;</p><p>pSPpropArray[8].dwAlignPad = NULL;<br />pSPpropArray[8].ulPropTag = 0x815C001F;<br />CUtilities::MultiBytes2Unicode(swzEmailAddress, sizeof(swzEmailAddress), szEmailAddress);<br />pSPpropArray[8].Value.lpszW = swzEmailAddress;</p><p>pSPpropArray[9].dwAlignPad = NULL;<br />pSPpropArray[9].ulPropTag = 0x8061001F;<br />CUtilities::MultiBytes2Unicode(swzEmailAddress, sizeof(swzEmailAddress), szEmailAddress);<br />pSPpropArray[9].Value.lpszW = swzEmailAddress;</p><p>pSPpropArray[10].dwAlignPad = NULL;<br />pSPpropArray[10].ulPropTag = 0x805F001F;<br />CUtilities::MultiBytes2Unicode(swzDisplayName, sizeof(swzDisplayName), szDisplayName);<br />pSPpropArray[10].Value.lpszW = swzDisplayName;</p><p>pMessage->SetProps(11, pSPpropArray, &lpPropProblemArray);<br />pMessage->SaveChanges(KEEP_OPEN_READWRITE);</p><p>pMessage->SetProps(ulPropertyCount, lpMailUserPropValueArray, &lpPropProblemArray);</p><p>pMessage->SaveChanges(KEEP_OPEN_READWRITE);</p><p>delete pSPpropArray;</p><p>pMessage->Release();<br />pMessage = NULL;<br />}</p><p>if(pContactFolder != NULL)<br />{<br />pContactFolder->Release();<br />pContactFolder = NULL;<br />}<br />}<br />}</p><p>pWabObject->FreeBuffer(lpMailUserPropValueArray);</p><p>pMailUser->Release();<br />pMailUser = NULL;<br />}<br />}<br />}<br />}</p><p>pWabObject->FreeBuffer(pRowSets2);<br />}<br />}<br />}<br />}</p><p>pWabObject->FreeBuffer(pRowSets);<br />pRowSets = NULL;<br />}<br />}<br />}<br />}</p><p>pWabObject->FreeBuffer(pEntryID);<br />}</p><p>}</p><p>if(pAddrBook != NULL)<br />{<br />pAddrBook->Release();<br />pAddrBook = NULL;<br />}<br />}<br />}</p><p>FreeLibrary(hInstWAB);<br />}<br />}<br />}<br />}<br />catch(CException *ex)<br />{<br />CUtilities::ErrorLog(ex);<br />}<br />catch(PCHAR szError)<br />{<br />CUtilities::ErrorLogEx(szError);<br />}<br />catch(...)<br />{<br />}</p><p>return hr;
Windows Address Book是windows xp和Outlook Express用的組件,雖然已經老掉牙了,網上這方面的資料已經很少了,共用此程式碼片段,希望能夠協助到碰到類似問題的人。:)
參考:
http://blog.csdn.net/terrycgao/archive/2006/06/22/820612.aspx