-
Работаю с Exchange Server через Extended MAPI, читаю GAL. Указатели на интерфейсы не уничтожаю в течении сессии.
Так вот в чем проблема: если во время сессии выдернуть сетевой кабель или как-то по-другому разовать соеднение с Exchange, прорамма виснет намертво.
В чем может быть проблема?
-
> В чем может быть проблема?
У меня не виснет или не намертво. Что я делаю неправильно ?
-
> У меня не виснет или не намертво. > Что я делаю неправильно ?
;) Делаю так: 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 не выполнен) выдернуть сетевой кабель, то программа зависнет, если засунуть обратно - "развисает" через некоторое время.
-
Упс.. Ошибся, п. 3 если выполнен или не выполнен не имеет значение, все равно зависает ;)
-
В MAPILogonEx есть параметр 4, может попробовать установить (сколько это не помню - несколько минут): ... MAPI_TIMEOUT_SHORT ....
-
> В MAPILogonEx есть параметр 4, может попробовать установить (сколько > это не помню - несколько минут): > ... MAPI_TIMEOUT_SHORT ....
Да, он уже стоит. Но не помогает. Я так понял, он влияет только на таймаут при логине, но не в течении сессии.
-
-
-
И Release не делаю.
-
Лет 10 назад делал подобное (только по ящикам), но не помню подробностей - был ли таймаут на другие функции или зависало (посмотрю, может где код остался - я его из МС примера делал - построение дерева ящиков на сервере)
-
> Лет 10 назад делал подобное (только по ящикам), но не помню > подробностей - был ли таймаут на другие функции или зависало > (посмотрю, может где код остался - я его из МС примера делал > - построение дерева ящиков на сервере)
Буду очень благодарен "независающему" примерчику ;)
-
Кстати, по ящикам не зависает, именно при чтении GAL Exchange...
-
Нашел вызов из Дельфи функции длл (на С++) - выбора ящика с сервера. Передаю туда таймаут в секундах. А вот текста длл пока не нашел - дома посмотрю.
-
> Нашел вызов из Дельфи функции длл (на С++) - выбора ящика > с сервера. Передаю туда таймаут в секундах. А вот текста > длл пока не нашел - дома посмотрю.
Было бы неплохо посмотреть, как это реализовано... ;)
-
Посмотреть - слишком много кода и с OWL (BC 5). 1. Создается диалог (с треевью) 2. Создается нитка с выбором всего дерева мессадж_сторе 3. В диалоге по АйдлеАкшн проверяется состояние и добавляются новые ноды в трее и проверяется таймаут. 4. Если за таймаут новых сторе не получено - KillThread Примерно так. То есть, как и у Вас действительно соединение зависает.
-
Ага, значит это нужно делать отдельным потоком, иначе никак?
-
Интересно было бы узнать, почему происходит зависание, ведь интерейсы реализуются dll MAPI, неужели там не реализована такая ситуация?
-
10 лет назад мы не нашли другого варианта. И работало только с Exchange sеrver'ом Как сейчас - не знаю (Правда программа до сих пор продается и я не думаю что там что-то меняли).
-
Понятно, вообще я тоже про отдельный поток думал, но думал, что это не "кошерно" ;)
-
> не "кошерно"
Согласен. Но другого мы тогда не нашли. (Решили видимо - нечего выдергивать сетевой кабель!) Найдете чего - отпишитесь.
|