2012-02-22 2 views
0

Я ищу способ извлечь все контакты и список рассылки (с соответствующими контактами) из WAB (адресной книги Windows).извлечения контактов и списков рассылки (групп) из wab (mapi)

Мне нужно сделать это, потому что мне нужно импортировать адресные книги с списками рассылки/группами в круглом кубе.

После некоторых исследований я основал проект C++ проекта Code (http://www.codeproject.com/Articles/3407/Accessing-the-Windows-Address-Book), но это поддерживает только контакты.

Оглядываясь на MSDN, я основал метод OpenEntry для iAddrBook, который должен поддерживать в третьем параметре интерфейс для открытия iDistList в моем случае, но я не могу найти нигде идентификатор интерфейса.

Я искал некоторую документацию, содержащую структуру WAB-файлов, но ничего.

Любые предложения?

ответ

1

Вот путь, который я использовал для acomplish это:

  1. Я использую метод WABOpen из DLL wab32 получить LPADRBOOK lpAddr;
  2. Я установил папку PAB lpAddr: вызовите lpAddr-> GetPAB(), OpenEntry, чтобы получить контейнер, а затем GetContentsTable в контейнере, чтобы получить LPMAPITABLE lpTable.
  3. Чтобы получить счетчик элементов таблицы, используйте GetRowCount на lpTable
  4. Чтобы проверить, является ли данная строка таблицы списком рассылки, используйте QueryRows, это должно возвращать MAPI_DISTLIST или MAPI_MAILUSER.
  5. Если это строка MAPI_DISTLIST, используйте PR_ENTRYID для вызова lpAdrBook-> OpenEntry(), это должно вернуть контейнер IABContainer, на который вы вызываете GetContentsTable, чтобы получить таблицу с содержимым этого списка рассылки.

последний OpenEntry выглядит следующим образом, я не ставлю третий параметр в любом месте:

// Now emails will be loaded. 
    ULONG ulObjType; 
    IUnknown* lpUnk; 
    hr = lpAdrBook->OpenEntry(DistEntryId.size, (LPENTRYID)DistEntryId.ab, NULL, 0, &ulObjType, &lpUnk); 
    if (FAILED(hr)) { 
    assert(false); return hr; 
    } 
+0

я делаю именно так, как вы, но мои OpenEntry вызов возвращается когда-либо MAPI_ABCONT (Address Book Container): \ ULONG lpcbEntryID; ENTRYID * lpEntryID; hRes = lpAdrBook-> GetPAB (& lpcbEntryID, & lpEntryID); 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) { ... –

+1

Вы можете увидеть мой код здесь: https://github.com/luskan/wabwrap/blob/master/WABWrapper.cpp – marcinj