Алекс Jenter - Программирование на Visual C++. Архив рассылки
- Название:Программирование на Visual C++. Архив рассылки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алекс Jenter - Программирование на Visual C++. Архив рассылки краткое содержание
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.
Программирование на Visual C++. Архив рассылки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
m_pBrowserApp->Navigate(strResourceURL, NULL, NULL, NULL, NULL);
} else bRetVal = FALSE;
delete [] lpszModule;
return bRetVal;
HTML ресурсы можно вынести в отдельный подкаталог, например html. Тогда в файле описания ресурсов (например, myapp.rc) необходимо добавить строки следующего вида:
IDR_MAIN HTML DISCARDABLE "html\\main.html"
DEL.GIF HTML DISCARDABLE "html\\del.gif"
LEFTARR.GIF HTML DISCARDABLE "html\\leftarr.gif"
RIGHTARR.GIF HTML DISCARDABLE "html\\rightarr.gif"
TITLE.GIF HTML DISCARDABLE "html\\title.gif"
NEWMSG.GIF HTML DISCARDABLE "html\\newmsg.gif"
Реализация доступа к ресурсам в IE достаточно умна, чтобы автоматически найти все необходимые объекты в ресурсах, на которые ссылается страничка, поэтому достаточно знать лишь ресурс-имя основной странички.
Q. Насколько корректно будут работать методы контроля утечек памяти (в частности объект CMemoryState) в многопоточных приложениях?
У меня сложилось впечатление, что объект CMemoryState не делает различия в каком потоке вызывались операторы new с момента обращения к memState.Checkpoint() до обращения к memState.DumpAllObjectsSince().
Видимо "моментальные снимки" распределённой памяти в данном случае не информативны, ведь несколько потоков работают в одном адресном пространстве?
Николай ТурпиткоA. Действительно, вне зависимости от потока, все распределения памяти попадают в один большой двусвязный список блоков памяти, который поддерживает отладочная версия CRT (если задан макрос _DEBUG). Что касается MFC-класса CMemoryState, он является просто тонкой обёрткой вокруг структуры _CrtMemState и функций для диагностики утечек памяти CRT. Поэтому он также не делает различий между потоками.
Хотя функции отладочной библиотеки очень полезны, они не отличаются гибкостью. Научить класс CMemoryState выдавать список блоков, выделенных текущим потоком, возможно, только используя недокументированные возможности CRT. Но кое-что в этом направлении можно сделать и легальными средствами.
При распределении памяти в отладочной версии программы каждому блоку назначается тип. По умолчанию блок получает тип _NORMAL_BLOCK. Существуют и другие типы: _CRT_BLOCK (блок, распределяемый для внутренних нужд CRT), _CLIENT_BLOCK (блок, к которому применяется пользовательская функция построения дампа), _FREE_BLOCK (блок, который уже освобождён с помощью free; такие блоки остаются в памяти, чтобы отладочная библиотека могла отследить ошибки, связанные с записью в уже освобождённый блок памяти) и _IGNORE_BLOCK (блок, который игнорируется при построении списка распределённых объектов). В стандартную библиотеку входит версия оператора new с четырьмя параметрами, которой можно передать тип распределяемого блока.
Соответственно, мы можем сохранить идентификатор потока, который нас интересует, в глобальной переменной, а затем передавать оператору new тип _NORMAL_BLOCK, если идентификатор текущего потока совпадает с сохранённым в переменной, и _IGNORE_BLOCK в противном случае. Чтобы облегчить эту задачу, можно написать небольшой модуль, который будет всем этим заниматься. Например:
//------------------------------
// threadmem.h
void DumpOnlyThisThread(DWORD id);
extern DWORD __DumpThread;
#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;
}
Объекты, распределённые во всех остальных потоках, не попадут в отчёт об утечках памяти.
Александр Шаргин ( rudankort@mail.ru)Q. Как создать окно ввода текста, переключаясь в которое устанавливался бы заданный язык. Например необходим ввод только русских слов в строке по которой ищется перевод на английский, а язык по умолчанию в виндовс английский. Хотелесь бы при запуске программы когда пользователь ткнет мышкой в поле ввода чтобы он не переключал язык по умолчанию на русский.
Alexander ShinkevichЭто все на сегодня. До встречи!
Алекс Jenter jenter@mail.ru Красноярск, 2001.Программирование на Visual C++
Выпуск №35 от 4 марта 2001 г.
Здравствуйте!
В сегодняшнем выпуске мы рассмотрим тему, которая также весьма и весьма часто фигурирует в ваших письмах – работа с электронной почтой из программы. Тема эта хорошо описывается в статье Михаила Плакунова, которую я и хочу предложить вашему вниманию.
СТАТЬЯ
MAPI. Добавь почту в свое приложение.
Автор: Михаил Плакунов
Источник: Софт Терра
В последние годы электронная почта является неотъемлемой составляющей персональных информационных средств. С большой степенью вероятности верно то, что, если у человека на столе стоит компьютер, то на нем установлена та или иная система электронной почты. Вместе с тем типичные приложения для работы с электронной почтой в чистом виде далеко не всегда отвечают требованиям автоматизации трудовой деятельности пользователя. В связи с этим существует потребность в создании различного рода приложений, не являющихся частью почтовых систем, но вместе с тем предоставляющих пользователю некоторые средства для работы с электронной почтой. Программный интерфейс MAPI, о котором пойдет речь в этой статье, является одним из средств, позволяющим создавать подобные приложения на платформе Windows.
В широком понимании MAPI (Messaging Application Programming Interface) – это целая архитектура, специфицирующая процессы взаимодействия отдельных приложений с различными почтовыми системами. Архитектура MAPI описывает так называемую подсистему MAPI, которая обеспечивает взаимодействие клиентских приложений с различными службами почтовой системы, такими как служба хранения информации, служба адресной книги, служба транспорта и т.д. С другой стороны MAPI – это прикладной интерфейс, который был создан для того, чтобы разработчики на C, C++, Visual Basic (а в последствии и Visual Basic Script) имели возможность добавлять в свои приложения функциональность для работы с электронной почтой. С точки зрения прикладной программы подсистема MAPI – это набор динамических библиотек, содержащих функции и объектно-ориентированные интерфейсы, благодаря которым взаимодействуют клиентские и серверные части почтовых приложений. О MAPI можно говорить много и долго (благо компания Microsoft постаралась сделать из MAPI очередного программного «монстра»), но наибольший интерес для разработчиков представляют так называемые клиентские прикладные программные интерфейсы, среди которых следует выделить в первую очередь Simple MAPI, MAPI и CDO.
Читать дальшеИнтервал:
Закладка: