Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

 MDB_WRITE, &lpMDB);

lpMDB->OpenEntry(lpPropValue->Value.bin.cb, (LPENTRYID)lpPropValue->Value.bin.lpb,

 NULL, MAPI_MODIFY, &ulObjType, (LPUNKNOWN *)&lpFolder);

lpFolder->CreateMessage(NULL, 0, &lpMsg);

SInitPropValue MsgProps[] = {

 {PR_DELETE_AFTER_SUBMIT, 0, TRUE},

 {PR_MESSAGE_CLASS, 0, (ULONG)"IPM.NOTE "},

 {PR_SUBJECT, 0, (ULONG)"Greeting"},

 {PR_BODY, 0, (ULONG)" Hello Bill!"}

};

lpMsg->SetProps(4, (LPSPropValue)&MsgProps, NULL);

// Begin MAPIResolveName(:);

lpSession->OpenAddressBook(0, NULL, AB_NO_DIALOG, &lpAdrBook);

MAPIAllocateBuffer(CbNewADRLIST(1), (LPVOID*)&lpAdrList);

MAPIAllocateBuffer(2*sizeof(SPropValue), (LPVOID*)&(lpAdrList->aEntries->rgPropVals));

ZeroMemory(lpAdrList->aEntries->rgPropVals, 2*sizeof(SPropValue));

lpAdrList->cEntries = 1;

lpAdrList->aEntries[0].ulReserved1 = 0;

lpAdrList->aEntries[0].cValues = 2;

lpAdrList->aEntries[0].rgPropVals[0].ulPropTag = PR_DISPLAY_NAME;

lpAdrList->aEntries[0].rgPropVals[0].Value.lpszA = "Bill Gates";

lpAdrList->aEntries[0].rgPropVals[1].ulPropTag = PR_RECIPIENT_TYPE;

lpAdrList->aEntries[0].rgPropVals[1].Value.l = MAPI_TO;

lpAdrBook->ResolveName(0, 0, NULL, lpAdrList);

lpMsg->ModifyRecipients(MODRECIP_ADD, lpAdrList);

// End MAPIResolveName(:);

// Begin MAPISendMail(:);

lpMsg->SubmitMessage(0);

// End MAPISendMail(:);

// Begin MAPILogoff (:);

lpSession->Logoff(0, 0, 0);

// End MAPILogoff (:);

Как

видно из этого примера большинство операций, являющихся примитивными для Simple MAPI, в MAPI 1.0 состоят из последовательностей вызовов тех или иных методов различных интерфейсов. Так, для того, чтобы создать сообщение в MAPI 1.0 требуется получить доступ и открыть контейнер с сообщениями, отыскать в нем папку для исходящих сообщений и только потом собственно создать в ней само сообщение и начинить его всей необходимой информацией. В Simple MAPI все эти промежуточные шаги скрыты от разработчика. С другой стороны MAPI 1.0 позволяет создавать сообщения в любой папке (да и не только сообщения, а объекты календаря, задачи и т.д.). Таким образом, взамен простоте использования появляются новые возможности.

Интерфейс MAPI 1.0, в отличие от Simple MAPI можно использовать при создании служб Windows NT. Это очень полезное свойство позволяет создавать различного рода почтовые мониторы. Типичная задача почтового монитора может заключаться в сканировании почтового ящика пользователя на предмет поступающей в него корреспонденции, ее разбор, анализ и последующие действия по результатам этого анализа.

Отдельного обсуждения заслуживает такая возможность MAPI 1.0 как создание всевозможных расширений (extensions) к клиентским программам почтовой системы MS Exchange Server (MS Outlook или MS Exchange Client). Расширения позволяют автоматизировать различные функции обработки сообщений, не реализованные в базовом наборе функций клиентской программы. В частности, механизм расширений позволяет создавать модули для обработки входящих сообщений, так называемые правила (rules), добавлять к клиентской программе дополнительные команды и пункты меню, а также обработчики событий, изменяющие поведение системы при определенных событиях и многое другое.

CDO – разумный компромисс

Интерфейс CDO (Collaboration Data Objects), ранее известный как OLE Messaging и Active Messaging представляет собой библиотеку, обеспечивающую доступ приложений к несколько ограниченному набору функция MAPI 1.0 через вызовы Automation. Функции работы с сообщениями могут быть встроены в приложения, созданные с помощью

любого средства разработки, являющегося контроллером Automation. К таковым относятся C/C++, Visual Basic, Visual Basic for Applications, VBScript, Javascript. Использование CDO существенно упрощает разработку приложений, работающих с электронной почтой, вместе с тем оставляя разработчику широкие возможности MAPI. Наибольшее применение CDO находит в скриптовых языках. Так, например, в комбинации с APS использование CDO позволяет достаточно легко создать почтового Web-клиента.

Сухой остаток

Итак, мы кратко рассмотрели 3 программных интерфейса, позволяющих встраивать в приложения на платформе Windows функциональность для работы с электронной почтой. У каждого из них есть свои преимущества и недостатки. Ничего универсального не существует – окончательный выбор того или иного средства зависит от конкретной задачи и является прерогативой разработчика. Более подробную информацию на эту тему можно получить на http://msdn.microsoft.com/library/psdk/mapi/.

ВОПРОС-ОТВЕТ 

Q. Как создать окно ввода текста переключаясь в которое устанавливался бы заданный язык. Например, необходим ввод только русских слов в строке, по которой ищется перевод на английский, а язык по умолчанию в виндовс английский. Хотелесь бы при запуске программы, когда пользователь ткнет мышкой в поле ввода, чтобы он не переключал язык по умолчаню на русский.

Alexander Shinkevich 

A1 Для переключения раскладок необходимо вызвать функцию LoadKeyboardLayout. 

Ниже приводится пример ее использования: 

1) Добавить в проект с помощью Class Wizard'а новый класс CMyEdit на основе CEdit.

2) Добавить в класс переменную, хранящую предыдущую установленную раскладку клавиатуры: 

TCHAR m_PreviousLayout[KL_NAMELENGTH];

3) Добавить обработчики WM_SETFOCUS и WM_KILLFOCUS: 

void CMyEdit::OnSetFocus(CWnd* pOldWnd) {

 CEdit::OnSetFocus(pOldWnd);

// запоминаем предыдущую раскладку клавиатуры

 ::GetKeyboardLayoutName(m_PreviousLayout);

 // устанавливаем новую раскладку для языка "Русский"

 ::LoadKeyboardLayout(_T("00000419"), KLF_ACTIVATE);

}

void CMyEdit::OnKillFocus(CWnd* pNewWnd) {

 CEdit::OnKillFocus(pNewWnd);

 // восстанавливаем предыдущую раскладку клавиатуры

 ::LoadKeyboardLayout(m_PreviousLayout, KLF_ACTIVATE);

}

4) Использовать CMyEdit вместо CEdit (на примере диалога): 

class CMyDlg : public CDialog {

 // ...

 CMyEdit m_Edit;

 // ...

};

void CMyDlg::DoDataExchange(CDataExchange* pDX) {

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CTestKeyboardDlg)

 DDX_Control( pDX, IDC_EDIT, m_Edit );

 //}}AFX_DATA_MAP

}

Алексей Гончаров 

A2 […] Также можно активизировать т.н. keyboard layout (раскладку клавиатуры) с помощью функции ActivateKeyboardLayout, активизирующей раскладку, загруженную предварительно с помощью указанной выше функции LoadKeyboardLayout. Хотя LoadKeyboardLayout сама может активизировать раскладку (при использовании флага KLF_ACTIVATE), но при частой смене языка оптимальнее использовать ActivateKeyboardLayout. Т.е. в начале загрузить раскладку с помощью LoadKeyboardLayout, а многократно переключать язык ввода функцией ActivateKeyboardLayout.

Igor Sukharev 
Поделиться:
Популярные книги

Измена. Тайный наследник

Лаврова Алиса
1. Тайный наследник
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Тайный наследник

Инквизитор Тьмы

Шмаков Алексей Семенович
1. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Ротмистр Гордеев 3

Дашко Дмитрий
3. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев 3

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Идеальный мир для Лекаря 28

Сапфир Олег
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 28

Сыночек в награду. Подари мне любовь

Лесневская Вероника
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Выстрел на Большой Морской

Свечин Николай
4. Сыщик Его Величества
Детективы:
исторические детективы
полицейские детективы
8.64
рейтинг книги
Выстрел на Большой Морской

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII