Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
ВнизMAPI: висяк при обрыве соединения Найти похожие ветки
← →
AlexKung (2008-07-08 14:24) [0]Работаю с Exchange Server через Extended MAPI, читаю GAL. Указатели на интерфейсы не уничтожаю в течении сессии.
Так вот в чем проблема: если во время сессии выдернуть сетевой кабель или как-то по-другому разовать соеднение с Exchange, прорамма виснет намертво.
В чем может быть проблема?
← →
Сергей М. © (2008-07-08 14:43) [1]
> В чем может быть проблема?
У меня не виснет или не намертво.
Что я делаю неправильно ?
← →
AlexKung (2008-07-08 17:37) [2]
> У меня не виснет или не намертво.
> Что я делаю неправильно ?
;)
Делаю так:
1.
MAPIInitialize
MAPILogonEx
Session.OpenAddressBook(0, nil, AB_NO_DIALOG,
FAddrBook.AddrBook)
FAddrBook.AddrBook.OpenEntry(0, nil, @IID_IABContainer, 0,
iTempVal, IUnknown(ABContainer)))
ABContainer.GetHierarchyTable
2.
Получаю список адресных книг, получаю интерфейс каждой, добавляю в массив, ABContainer тоже, в общем бережно храню пока не будет команды на закрытие сессии ;)
3.
Далее, если нужно, читаю опеределенную книгу, извлекаю контакты
Когда нужно закрыть сессию, присваиваю всем интерфейсам nil, вызываю Session.Logoff и MAPIUninitialize.
Так вот: если после того как выполнены пункты 1 и 2 и программа просто ничего не делает (но п. 3 не выполнен) выдернуть сетевой кабель, то программа зависнет, если засунуть обратно - "развисает" через некоторое время.
← →
AlexKung (2008-07-08 17:46) [3]Упс.. Ошибся, п. 3 если выполнен или не выполнен не имеет значение, все равно зависает ;)
← →
SergeyIT © (2008-07-08 18:58) [4]В MAPILogonEx есть параметр 4, может попробовать установить (сколько это не помню - несколько минут):
... MAPI_TIMEOUT_SHORT ....
← →
AlexKung (2008-07-08 19:03) [5]> В MAPILogonEx есть параметр 4, может попробовать установить (сколько
> это не помню - несколько минут):
> ... MAPI_TIMEOUT_SHORT ....
Да, он уже стоит. Но не помогает. Я так понял, он влияет только на таймаут при логине, но не в течении сессии.
← →
SergeyIT © (2008-07-08 19:04) [6]А это
http://jtsoftik.narod.ru/builder/num183.html
← →
AlexKung (2008-07-08 19:16) [7]> http://jtsoftik.narod.ru/builder/num183.html
Примерно так и делаю, только не вызываю GetPAB, параметры ставлю такие, чтобы диалоги не показывались (AB_NO_DIALOG) и parentwindow = 0.
← →
AlexKung (2008-07-08 19:18) [8]И Release не делаю.
← →
SergeyIT © (2008-07-08 19:24) [9]Лет 10 назад делал подобное (только по ящикам), но не помню подробностей - был ли таймаут на другие функции или зависало (посмотрю, может где код остался - я его из МС примера делал - построение дерева ящиков на сервере)
← →
AlexKung (2008-07-08 19:29) [10]
> Лет 10 назад делал подобное (только по ящикам), но не помню
> подробностей - был ли таймаут на другие функции или зависало
> (посмотрю, может где код остался - я его из МС примера делал
> - построение дерева ящиков на сервере)
Буду очень благодарен "независающему" примерчику ;)
← →
AlexKung (2008-07-08 19:30) [11]Кстати, по ящикам не зависает, именно при чтении GAL Exchange...
← →
SergeyIT © (2008-07-08 19:37) [12]Нашел вызов из Дельфи функции длл (на С++) - выбора ящика с сервера. Передаю туда таймаут в секундах. А вот текста длл пока не нашел - дома посмотрю.
← →
AlexKung (2008-07-08 21:16) [13]
> Нашел вызов из Дельфи функции длл (на С++) - выбора ящика
> с сервера. Передаю туда таймаут в секундах. А вот текста
> длл пока не нашел - дома посмотрю.
Было бы неплохо посмотреть, как это реализовано... ;)
← →
SergeyIT © (2008-07-08 22:08) [14]Посмотреть - слишком много кода и с OWL (BC 5).
1. Создается диалог (с треевью)
2. Создается нитка с выбором всего дерева мессадж_сторе
3. В диалоге по АйдлеАкшн проверяется состояние и добавляются новые ноды в трее и проверяется таймаут.
4. Если за таймаут новых сторе не получено - KillThread
Примерно так.
То есть, как и у Вас действительно соединение зависает.
← →
AlexKung (2008-07-08 22:30) [15]Ага, значит это нужно делать отдельным потоком, иначе никак?
← →
AlexKung (2008-07-08 22:32) [16]Интересно было бы узнать, почему происходит зависание, ведь интерейсы реализуются dll MAPI, неужели там не реализована такая ситуация?
← →
SergeyIT © (2008-07-08 22:38) [17]10 лет назад мы не нашли другого варианта. И работало только с Exchange sеrver"ом
Как сейчас - не знаю (Правда программа до сих пор продается и я не думаю что там что-то меняли).
← →
AlexKung (2008-07-09 00:29) [18]Понятно, вообще я тоже про отдельный поток думал, но думал, что это не "кошерно" ;)
← →
SergeyIT © (2008-07-09 00:34) [19]
> не "кошерно"
Согласен. Но другого мы тогда не нашли. (Решили видимо - нечего выдергивать сетевой кабель!)
Найдете чего - отпишитесь.
← →
AlexKung (2008-07-18 14:42) [20]В общем, через потоки сделал, чтение контактов можно прервать.
Но при вызове MsgStore.OpenEntry, где MsgStore - это либо Public Folders, либо ящик пользователя на сервере Exchange при отсутствии подключения к серверу, получается такая ситуация:
- Сначала происходит долгий висяк (~5-10мин.)
- Затем возвращается ошибка MAPI_E_FAILONEPROVIDER
Если подключение к серверу есть, то все нормально.
Так вот такой вопрос: почему так надолго зависает и как этого избежать?
← →
AlexKung (2008-07-18 14:44) [21]И самое интересное: если это все запхать в поток и по таймауту попробовать убить поток, то прогамма виснет :(
← →
SergeyIT © (2008-07-18 22:20) [22]Мы использовали нитки без окон, а в Дельфи к ниткам окно привязано - может поэтому виснет.
(Использовали АПИшную ::TerminateThread(hThread, 0);)
← →
AlexKung (2008-07-19 12:11) [23]Спасибо, буду пробовать ;)
← →
AlexKung (2008-07-21 18:55) [24]Короче, не подходит мне такой способ, даже Personal Folders не читаются, а TerminateThread вообще не рекомендуется использовать.
Я так понимаю, при запросе MsgStore происходит попытка подключения к серверу, а как можно ли заставить в пределах сессии не пытаться получать доступ к серверу, если по опр. таймауту не подключились?
← →
SergeyIT © (2008-07-21 19:24) [25]Не рекомендуется TerminateThread - а что делать?
(С этим кодом продукт уже 10 лет на рынке и ничего)
А если подключились и происходит обрыв - тогда висяк (и только TerminateThread)!
В реальной жизни, думаю, не так часто происходят такие события, если все правильно организовано.
← →
AlexKung (2008-07-23 22:14) [26]
> Не рекомендуется TerminateThread - а что делать?
Да, согласен, нарвеное ничего больше нельзя сделать :(
Просто меня волнует, что утечка памяти будет при таком подходе :(
Самое интересное, что у Microsoft это нигде не документировано (по крайней мере я не нашел) и даже Outlook 2003 виснет на 2-3 мин если пропробовать развернуть узел All Public Folders ;)
← →
SergeyIT © (2008-07-24 09:47) [27]
> утечка памяти будет
Если не много памяти использовать в нитке (и нитка на чистом API), то утечка небольшая. Это просто протестировать надо.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c