Шрифт:
Интервал:
Закладка:
#ifdef _DEBUG
#define THREAD_DEBUG_NEW
new((__DumpThread == ::GetCurrentThreadId() ?
_IGNORE_BLOCK : _NORMAL_BLOCK), THIS_FILE, __LINE__)
#else
#define THREAD_DEBUG_NEW new
#endif /* _DEBUG */
//------------------------------
// threadmem.cpp
void DumpOnlyThisThread(DWORD id) {
#ifdef _DEBUG
InterlockedExchange((LONG *)&__DumpThread, id);
#endif /* _DEBUG */
}
DWORD __DumpThread;
Теперь функция потока, в котором мы хотим отслеживать утечки памяти, может выглядеть так:
#include "threadmem.h"
#define new THREAD_DEBUG_NEW
UINT ThreadFunc(LPVOID) {
DumpOnlyThisThread(::GetCurrentThreadId());
CMemoryState st;
st.Checkpoint();
// Распределяем и освобождаем память в процессе работы…
new int[100];
new CPoint[200];
…
st.DumpAllObjectsSince();
return 0;
}
Объекты, распределённые во всех остальных потоках, не попадут в отчёт об утечках памяти.
Александр Шаргин ([email protected]) В ПОИСКАХ ИСТИНЫQ. Как создать окно ввода текста, переключаясь в которое устанавливался бы заданный язык. Например необходим ввод только русских слов в строке по которой ищется перевод на английский, а язык по умолчанию в виндовс английский. Хотелесь бы при запуске программы когда пользователь ткнет мышкой в поле ввода чтобы он не переключал язык по умолчанию на русский.
Alexander ShinkevichЭто все на сегодня. До встречи!
Алекс Jenter [email protected] Красноярск, 2001.Программирование на Visual C++
Выпуск №35 от 4 марта 2001 г.
Здравствуйте!
В сегодняшнем выпуске мы рассмотрим тему, которая также весьма и весьма часто фигурирует в ваших письмах – работа с электронной почтой из программы. Тема эта хорошо описывается в статье Михаила Плакунова, которую я и хочу предложить вашему вниманию.
СТАТЬЯ
MAPI. Добавь почту в свое приложение.
Автор: Михаил Плакунов
Источник: Софт Терра
ВведениеВ последние годы электронная почта является неотъемлемой составляющей персональных информационных средств. С большой степенью вероятности верно то, что, если у человека на столе стоит компьютер, то на нем установлена та или иная система электронной почты. Вместе с тем типичные приложения для работы с электронной почтой в чистом виде далеко не всегда отвечают требованиям автоматизации трудовой деятельности пользователя. В связи с этим существует потребность в создании различного рода приложений, не являющихся частью почтовых систем, но вместе с тем предоставляющих пользователю некоторые средства для работы с электронной почтой. Программный интерфейс MAPI, о котором пойдет речь в этой статье, является одним из средств, позволяющим создавать подобные приложения на платформе Windows.
Что есть MAPI?В широком понимании MAPI (Messaging Application Programming Interface) – это целая архитектура, специфицирующая процессы взаимодействия отдельных приложений с различными почтовыми системами. Архитектура MAPI описывает так называемую подсистему MAPI, которая обеспечивает взаимодействие клиентских приложений с различными службами почтовой системы, такими как служба хранения информации, служба адресной книги, служба транспорта и т.д. С другой стороны MAPI – это прикладной интерфейс, который был создан для того, чтобы разработчики на C, C++, Visual Basic (а в последствии и Visual Basic Script) имели возможность добавлять в свои приложения функциональность для работы с электронной почтой. С точки зрения прикладной программы подсистема MAPI – это набор динамических библиотек, содержащих функции и объектно-ориентированные интерфейсы, благодаря которым взаимодействуют клиентские и серверные части почтовых приложений. О MAPI можно говорить много и долго (благо компания Microsoft постаралась сделать из MAPI очередного программного «монстра»), но наибольший интерес для разработчиков представляют так называемые клиентские прикладные программные интерфейсы, среди которых следует выделить в первую очередь Simple MAPI, MAPI и CDO.
Начнем с простого – Simple MAPISimple MAPI предоставляет в распоряжение разработчиков всего 12 простейших функций. Они позволяют выполнять такие действия, как «сформировать сообщение», «указать адрес получателя», «отправить», «получить». Причем все операции с сообщениями можно производить только в рамках одной папки, являющейся папкой для входящих сообщений текущего контейнера доставки (в почтовой системе MS Exchange Server это обычно или в русскоязычной версии). Разработчик не имеет доступа к полной структуре папок почтового сервера, то есть может контролировать сообщение лишь до тех пор, пока пользователь не переместит его из папки в какую-либо другую.
Другим недостатком Simple MAPI является то, что он позволяет работать только со стандартными полями сообщения, такими как «Тема», «Отправитель», «Получатель», «Дата отправки», «Текст сообщения», «Класс сообщения», а также с вложенными файлами.
При всей своей ограниченности Simple MAPI подкупает имено простотой в освоении и использовании. Тому, кто имеет даже небольшой опыт программирования на C или Visual Basic достаточно нескольких минут для, того чтобы научиться использовать этот интерфейс.
Следующий фрагмент кода на языке C позволит убедиться в этом (для простоты несущественные участки кода, такие как объявление переменных и обработка ошибок опущены).
MAPILogon(0,"My Profile", NULL, MAPI_NEW_SESSION, 0, &pSession);
MAPIResolveName(pSession, 0, "Bill Gates", 0, 0, &pRecipient);
ZeroMemory(&pMessage, sizeof(pMessage));
pMessage.lpszSubject = " Greeting";
pMessage.lpszNoteText = "Hello Bill!";
pMessage.nRecipCount = 1;
pMessage.lpRecips = Recipient;
MAPISendMail(pSession, 0, &pMessage, 0, 0);
MAPILogoff(pSession, 0, 0, 0);
В приведенном примере формируется сообщение с темой , содержащее текст и отправляется адресату, видимое имя которого в адресной книге. Сейчас мы разберем по шагам как это делается.
Первым делом клиентской программе необходимо начать сеанс работы с почтовой системой, для чего при помощи функции MAPILogon открывается сессия Simple MAPI. Затем из видимого имени ("Bill Gates") функция MAPIResolveName формирует структуру, содержащую точную и полную информацию об адресате (в частности его электронный адрес). Полученная информация об адресате наряду с темой и текстом формирует структуру, содержащую почтовое сообщение, готовое к отправке. Функция MAPISendMail отправляет сообщение по электронной почте. Наконец, функция MAPILogoff завершает сеанс работы с почтовой системой, закрывая сессию Simple MAPI.
Просто, не правда ли? Немного модифицировав программу, можно дать ей возможность отправлять сообщения, содержащие не только текст, но и вложенные файлы. Изучив еще пару-тройку функций Simple MAPI, можно с легкостью запрограммировать получение анализ и удаление сообщений, содержащихся в почтовом ящике пользователя.
Simple MAPI позволяет запрограммировать две основные функции электронной почты – отправку и прием сообщений. Зачастую это вся функциональность, необходимая приложению для работы с электронной почтой. Типичными примерами использования Simple MAPI являются приложения, производящие рассылку сообщений (возможно однотипных, по шаблону) множеству адресатов, а также приложения, время от времени сканирующие почтовый ящик пользователя и производящие анализ и обработку поступающей в него корреспонденции.
Программисты на C найдут определения всех функций, структур и констант Simple MAPI в файле MAPI.H, входящем в состав Microsoft Visual Studio. Его аналогом для Visual Basic является файл MAPI.BAS. Сами функции находятся в динамической библиотеке MAPI.DLL. Как правило Simple MAPI входит в состав клиентских почтовых программ, причем не только работающих в архитектуре (MS Outlook, MS Exchange Client), но и обычных (MS Outlook Express, Eudora Pro, а в скором будущем и The Bat!).
MAPI 1.0 – для продвинутыхSimple MAPI на то и simple, что накладывает серьезные ограничения на разработчика как в плане функциональности, так и в плане производительности приложения. Полностью снять эти оковы позволяет гибкий и мощный программный интерфейс MAPI 1.0 (в прошлом – Extended MAPI по аналогии с Simple MAPI). MAPI 1.0 – это совокупность более ста функций и нескольких десятков COM-интерфейсов, предоставляющих программистам на C и C++ богатый инструментарий для создания приложений, работающих с электронной почтой. Simple MAPI можно назвать оберткой MAPI 1.0, которая скрывает множество деталей и нюансов взаимодействия приложений с почтовыми системами.
MAPI 1.0 предоставляет разработчику не только возможность реализации таких простых функций как отправка или прием почтовых сообщений, но и механизмы для более тесного взаимодействия с отдельными частями систем электронной почты – с адресной книгой, иерархической структурой папок на почтовом сервере, службой транспорта и т.д. Более того, с помощью MAPI 1.0 можно создавать даже части почтовых систем – программные шлюзы, различные службы обработки информации, которые являются частью MAPI-совместимых почтовых серверов. Не будет преувеличением сказать, что, используя MAPI 1.0 можно создать свою собственную клиентскую почтовую программу, аналогичную MS Oulook со всеми ее богатыми возможностями.
- Программирование - Ирина Козлова - Программирование
- Программирование — вторая грамотность - Андрей Ершов - Программирование
- 97 этюдов для архитекторов программных систем - Нил Форд - Программирование
- Платформа J2Me - Автор неизвестен - Программирование