Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2009.09.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
2-1247220630
liveD
2009-07-10 14:10
2009.09.13
создание службы


15-1247605777
Игорь Шевченко
2009-07-15 01:09
2009.09.13
С днем рождения, Digitman!


2-1247119359
Алексей85
2009-07-09 10:02
2009.09.13
Перенос приложения


1-1214468435
KSergey
2008-06-26 12:20
2009.09.13
Ошибки при вычислениях после EIntegerOverflow


1-1215010376
int64
2008-07-02 18:52
2009.09.13
Как узнать текущее московское время?