Конференция "WinAPI" » MAPI: висяк при обрыве соединения [D7, WinXP]
 
  • AlexKung (08.07.08 14:24) [0]
    Работаю с Exchange Server через Extended MAPI, читаю GAL. Указатели на интерфейсы не уничтожаю в течении сессии.

    Так вот в чем проблема: если во время сессии выдернуть сетевой кабель или как-то по-другому разовать соеднение с Exchange, прорамма виснет намертво.

    В чем может быть проблема?
  • Сергей М. © (08.07.08 14:43) [1]

    > В чем может быть проблема?


    У меня не виснет или не намертво.
    Что я делаю неправильно ?
  • AlexKung (08.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 (08.07.08 17:46) [3]
    Упс.. Ошибся, п. 3 если выполнен или не выполнен не имеет значение, все равно зависает ;)
  • SergeyIT © (08.07.08 18:58) [4]
    В MAPILogonEx есть параметр 4, может попробовать установить (сколько это не помню - несколько минут):
    ... MAPI_TIMEOUT_SHORT ....
  • AlexKung (08.07.08 19:03) [5]
    > В MAPILogonEx есть параметр 4, может попробовать установить (сколько
    > это не помню - несколько минут):
    > ... MAPI_TIMEOUT_SHORT ....

    Да, он уже стоит. Но не помогает. Я так понял, он влияет только на таймаут при логине, но не в течении сессии.
  • SergeyIT © (08.07.08 19:04) [6]
  • AlexKung (08.07.08 19:16) [7]
    > http://jtsoftik.narod.ru/builder/num183.html
    Примерно так и делаю, только не вызываю GetPAB, параметры ставлю такие, чтобы диалоги не показывались (AB_NO_DIALOG) и parentwindow = 0.
  • AlexKung (08.07.08 19:18) [8]
    И Release не делаю.
  • SergeyIT © (08.07.08 19:24) [9]
    Лет 10 назад делал подобное (только по ящикам), но не помню подробностей - был ли таймаут на другие функции или зависало (посмотрю, может где код остался - я его из МС примера делал - построение дерева ящиков на сервере)
  • AlexKung (08.07.08 19:29) [10]

    > Лет 10 назад делал подобное (только по ящикам), но не помню
    > подробностей - был ли таймаут на другие функции или зависало
    > (посмотрю, может где код остался - я его из МС примера делал
    > - построение дерева ящиков на сервере)

    Буду очень благодарен "независающему" примерчику ;)
  • AlexKung (08.07.08 19:30) [11]
    Кстати, по ящикам не зависает, именно при чтении GAL Exchange...
  • SergeyIT © (08.07.08 19:37) [12]
    Нашел вызов из Дельфи функции длл (на С++) - выбора ящика с сервера. Передаю туда таймаут в секундах. А вот текста длл пока не нашел - дома посмотрю.
  • AlexKung (08.07.08 21:16) [13]

    > Нашел вызов из Дельфи функции длл (на С++) - выбора ящика
    > с сервера. Передаю туда таймаут в секундах. А вот текста
    > длл пока не нашел - дома посмотрю.

    Было бы неплохо посмотреть, как это реализовано... ;)
  • SergeyIT © (08.07.08 22:08) [14]
    Посмотреть - слишком много кода и с OWL (BC 5).
    1. Создается диалог (с треевью)
    2. Создается нитка с выбором всего дерева мессадж_сторе
    3. В диалоге по АйдлеАкшн проверяется состояние и добавляются новые ноды в трее и проверяется таймаут.
    4. Если за таймаут новых сторе не получено - KillThread
    Примерно так.
    То есть, как и у Вас действительно соединение зависает.
  • AlexKung (08.07.08 22:30) [15]
    Ага, значит это нужно делать отдельным потоком, иначе никак?
  • AlexKung (08.07.08 22:32) [16]
    Интересно было бы узнать, почему происходит зависание, ведь интерейсы реализуются dll MAPI, неужели там не реализована такая ситуация?
  • SergeyIT © (08.07.08 22:38) [17]
    10 лет назад мы не нашли другого варианта. И работало только с Exchange sеrver'ом
    Как сейчас - не знаю (Правда программа до сих пор продается и я не думаю что там что-то меняли).
  • AlexKung (09.07.08 00:29) [18]
    Понятно, вообще я тоже про отдельный поток думал, но думал, что это не "кошерно" ;)
  • SergeyIT © (09.07.08 00:34) [19]

    > не "кошерно"

    Согласен. Но другого мы тогда не нашли. (Решили видимо - нечего выдергивать сетевой кабель!)
    Найдете чего - отпишитесь.
 
Конференция "WinAPI" » MAPI: висяк при обрыве соединения [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0]