HRESULT hr = S_OK; try { LPWABOPEN lpfnWABOpen = NULL; // Defined in Wabapi.h. HINSTANCE hInstWAB = NULL; CRegKey regKey; LONG nReturn = regKey.Open(HKEY_LOCAL_MACHINE, WAB_DLL_PATH_KEY, KEY_READ); if(nReturn == ERROR_SUCCESS) { ULONG nChars = BUFFER_SIZE; TCHAR szValue[BUFFER_SIZE]; nReturn = regKey.QueryStringValue("", szValue, &nChars); regKey.Close(); if(nReturn == ERROR_SUCCESS) { if(lstrlen(szValue) > 0) { HRESULT hr = E_FAIL; hInstWAB = LoadLibrary(szValue); if(hInstWAB != NULL) { lpfnWABOpen = (LPWABOPEN) GetProcAddress(hInstWAB, "WABOpen"); if (lpfnWABOpen) { WAB_PARAM wp = {0}; wp.cbSize = sizeof(WAB_PARAM); wp.ulFlags = WAB_ENABLE_PROFILES; wp.hwnd = NULL; wp.szFileName = NULL; IAddrBook* pAddrBook; CComPtr<IWABObject> pWabObject; hr = lpfnWABOpen(&pAddrBook, &pWabObject, &wp, 0); if(SUCCEEDED(hr)) { ULONG cbEntryID; LPENTRYID pEntryID = NULL; ULONG ulObjType = NULL; hr = pAddrBook->GetPAB(&cbEntryID, &pEntryID); if(SUCCEEDED(hr)) { CComPtr<IABContainer> pABContainer = NULL; ULONG ulFlags = MAPI_BEST_ACCESS; hr = pAddrBook->OpenEntry(cbEntryID, 0, NULL, ulFlags, &ulObjType, (LPUNKNOWN*)&pABContainer); if(SUCCEEDED(hr)) { CComPtr<IMAPITable> pMapiTable = NULL; hr= pABContainer->GetHierarchyTable(CONVENIENT_DEPTH, &pMapiTable); if(SUCCEEDED(hr)) { ULONG ulCount = 0; hr = pMapiTable->GetRowCount(0, &ulCount); if(SUCCEEDED(hr)) { LPSRowSet pRowSets = NULL; //hr = HrQueryAllRows(pMapiTable, (SPropTagArray *)&propTagArray, NULL, NULL, ulCount, &pRowSets); hr = pMapiTable->QueryRows(ulCount, 0, &pRowSets); if(SUCCEEDED(hr)) { for(int i = 0; i < pRowSets->cRows; i ++) { ULONG ulObjectType; int nEntryIDIndex = -1; DWORD dwDepth = 0; TCHAR szFolderName[BUFFER_SIZE]; ZeroMemory(szFolderName, sizeof(szFolderName)); for(int j = 0; j < pRowSets->aRow[i].cValues; j ++) { switch(pRowSets->aRow[i].lpProps[j].ulPropTag) { case PR_ADDRTYPE: break; case PR_DISPLAY_NAME: strcpy_s(szFolderName, pRowSets->aRow[i].lpProps[j].Value.lpszA); break; case PR_DISPLAY_TYPE: break; case PR_ENTRYID: nEntryIDIndex = j; break; case PR_DEPTH: dwDepth = pRowSets->aRow[i].lpProps[j].Value.l; break; case PR_INSTANCE_KEY: break; case PR_OBJECT_TYPE: ulObjectType = pRowSets->aRow[i].lpProps[j]