Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1247516188
DVM
2009-07-14 00:16
2009.09.13
TStringList неправильно разбивает строку по разделителям.


15-1247691352
Германн
2009-07-16 00:55
2009.09.13
Сколько максимально может потреблять телевизор ЭЛТ


2-1247317149
Овотог
2009-07-11 16:59
2009.09.13
Выделить кавычками "" слово из текста


4-1217576481
kyn66
2008-08-01 11:41
2009.09.13
Какой установлен принтер ?


15-1247255297
Shyrick
2009-07-10 23:48
2009.09.13
Сложение чисел в двоичной системе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский