Outlook Адресная книга
От: sovmaster  
Дата: 21.09.04 04:16
Оценка:
Люди кто-нибудь редактировал записи в адресной книге outlook через функцию MAPIAddress. Везде в сети написано что эта функция создает и модифицирует записи в адресной книге, я че-то никак не воткну как это сделать. Вообще надо добавить записи в книгу. Может кто-то этим занимался и знаеи как сделать?
Зараннее благодарен.
Re: Outlook Адресная книга
От: VVV Россия  
Дата: 21.09.04 13:04
Оценка:
Здравствуйте, sovmaster, Вы писали:

S>Люди кто-нибудь редактировал записи в адресной книге outlook через функцию MAPIAddress. Везде в сети написано что эта функция создает и модифицирует записи в адресной книге, я че-то никак не воткну как это сделать. Вообще надо добавить записи в книгу. Может кто-то этим занимался и знаеи как сделать?

S>Зараннее благодарен.

Эта функция показывает диалог, где можно не только выбрать реципиента, но и создать новую запись в адресной книге.. Т.е. диалог такой же, как и из аутлука Tools/Address book...

Если надо создавать программно и без вмешательства юзера, то эта функция не подойдёт. Используй MAPIX (экстендед МАПИ) если это Outlook, или WABOpen если это Outlook Express и используется Windows Address Book.
для Outllok сценарий
1. инит MAPIInitialize
2. создаём сессию MAPILogonEx
3. берём у сессии адресную книгу IMAPISession::OpenAddressBook
4. у адресной книги берём контейнер, где будет создаваться запись — для простоты PAB (personal Adress Book)
IAddrBook::GetPAB
5. Создаём новую запись в контейнере IAddrBook::NewEntry
6. Открываем эту запись IAddrBook::OpenEntry получаем интерфейс IMailUser
7. Устанавливаем необходимые проперти IMailUser : IMAPIProp::SetProps такие как
PR_ADDRTYPE
PR_DISPLAY_NAME
PR_EMAIL_ADDRESS

8. всё релизим, и отлогиниваемся..

Для Outlook Express всё аналогично, но сразу берём книгу WABOpen (шаг 3)
Re[2]: Outlook Адресная книга
От: sovmaster  
Дата: 23.09.04 16:48
Оценка:
На 5 шаге возникла проблема. При вызове NewEntry появляется диалог где предлагается выбрать "Тип адреса" контакт иди Список рассылки. Я так понимаю это шаблоны для заполнения адресной книги.
Не понятно где взять указательна на шаблон уже существующий например контакт.
Re[3]: Outlook Адресная книга
От: VVV Россия  
Дата: 23.09.04 18:29
Оценка:
Здравствуйте, sovmaster, Вы писали:

S>На 5 шаге возникла проблема. При вызове NewEntry появляется диалог где предлагается выбрать "Тип адреса" контакт иди Список рассылки. Я так понимаю это шаблоны для заполнения адресной книги.

S>Не понятно где взять указательна на шаблон уже существующий например контакт.

из МСДН

To use a particular template for adding a new entry to a modifiable container

Call IMAPISession::OpenEntry to open the destination container, setting the lpEntryID parameter to the entry identifier of the container.
Call the destination container's IMAPIProp::OpenProperty method and set ulPropTag to PR_CREATE_TEMPLATES and lpiid to IID_IMAPITable. The container will return a one-off table listing all of the templates that it supports for creating new entries.
Retrieve the row that represents the template for the particular type of entry you want to create. The PR_ADDRTYPE column indicates the address type that is supported by the template.
Call IAddrBook::NewEntry and set lpEIDNewEntryTpl to the entry identifier of the selected template. This will be the PR_ENTRYID column from the template's row in the one-off table. Pass zero in cbEIDContainer and NULL in lpEIDContainer. Pass a valid pointer in the lppEIDNewEntry parameter if you want to retain the new entry's entry identifier.


Сегодня уже поздно.. если не получится-посмотрю завтра.
Re[4]: Outlook Адресная книга
От: sovmaster  
Дата: 23.09.04 20:05
Оценка:
Ура I did it. Вот кусочек:
hr = pAddressBook->GetPAB(& cbEID, &lpEID);
if(FAILED(hr)){
::MessageBox(hparent, _T("MAPIGetPab() failure."), _T("mapi"), MB_OK |MB_ICONERROR);
return FALSE; }


ULONG ulObjType = 0;
LPABCONT lpContainer = NULL;
hr = pAddressBook->OpenEntry(cbEID,
(LPENTRYID)lpEID,
NULL,
0 ,
&ulObjType,
(LPUNKNOWN *)&lpContainer);

LPMAPIPROP FAR lppMAPIPropEntry = NULL;
LPCIID lpInterface = NULL;
ULONG FAR lpulObjType = 0;
LPUNKNOWN FAR lppUnk = NULL;
hr = lpContainer->CreateEntry(cbEID, lpEID, CREATE_CHECK_DUP_LOOSE ,&lppMAPIPropEntry);
hr = lpContainer->OpenEntry(cbEID,lpEID,lpInterface,MAPI_BEST_ACCESS ,&lpulObjType,&lppUnk);

SPropValue spropv[3];
LPSTR addtype = "SMTP";
LPSTR dispname = "XXX";
LPSTR email = "fff@ff.ru";
ZeroMemory(&spropv,sizeof(spropv));
spropv[0].ulPropTag = PR_ADDRTYPE;
spropv[0].Value.lpszA = addtype;
spropv[1].ulPropTag = PR_DISPLAY_NAME;
spropv[1].Value.lpszA = dispname;
spropv[2].ulPropTag = PR_EMAIL_ADDRESS;
spropv[2].Value.lpszA = email;
LPSPropProblemArray FAR lppProblems = NULL;
//hr = lpContainer->SetProps(3,spropv,&lppProblems );-если использовать эту функцию, то зменится название источника адресов в данном случае на ХХХ
hr = lppMAPIPropEntry->SetProps(3,spropv,&lppProblems );
hr = lpContainer->SaveChanges(0);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.