AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.04.2008, 16:39   #1  
axaLearner is offline
axaLearner
Участник
 
88 / 17 (1) ++
Регистрация: 24.06.2004
Адрес: God knows
Мониторинг состояния COM объекта
Есть следующая задача: DAX управляет работой некой программы через COM объект. В случае когда эта программа закрывается не из DAX, т.е. DAX не знает о том что программа была закрыта, DAX продолжает пытаться дергать методы экземпляра COM и получает ошибку времени выполнения. Задача состоит в том, чтобы каждый раз, перед тем как вызвать метод COM - объекта, проверять, существует ли соответствующий ему процесс. На данный момент представляю решение след. образом:
  1. нужно получить handle COM-приложения;
  2. посредством API надо мониторить состояния объекта с заданным handle;
Пока ни один из пунктов не осилил. Буду благодарен за предложенное решение.
Старый 09.04.2008, 17:08   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от axaLearner Посмотреть сообщение
Есть следующая задача: DAX управляет работой некой программы через COM объект. В случае когда эта программа закрывается не из DAX, т.е. DAX не знает о том что программа была закрыта, DAX продолжает пытаться дергать методы экземпляра COM и получает ошибку времени выполнения. Задача состоит в том, чтобы каждый раз, перед тем как вызвать метод COM - объекта, проверять, существует ли соответствующий ему процесс.
У вас исходная ситуация и сформулированная постановка задачи совершенно не стыкуются. Точнее, конечно, можно и так делать, но в многозадачных ОС так не принято. В многозадачных ОС принято использовать объекты синхронизации и функции ожидания изменений состояния этих объектов. Чтобы узнать, когда какой-то процесс завершится, получите его handle, создайте отдельный поток и вызовите WaitForSingleObject() с этим handle'ом и временем ожидания WAIT_INFINITE. Когда процесс завершится, функция вернет управление, и этот фоновый поток сможет что-то сделать в связи с тем, что управляемый процесс завершился и на COM-вызовы больше не ответит.

PS. Получить handle процесса (COM-сервера) можно, перебрав запущенные процессы и выбрав нужный по имени - это, конечно, для случая, когда в каждый момент времени может быть запущен один экземпляр соотв. процесса.

Последний раз редактировалось gl00mie; 09.04.2008 в 17:10.
За это сообщение автора поблагодарили: axaLearner (1).
Старый 09.04.2008, 17:21   #3  
axaLearner is offline
axaLearner
Участник
 
88 / 17 (1) ++
Регистрация: 24.06.2004
Адрес: God knows
gl00mie, спасибо за ответ, модель с использованием ожидающего потока мне понравилась и должна меня устроить.

С handle пока проблема - одна сессия DAX будет запускать один и тот же COM-сервер в нескольких экземплярах и с точки зрения DAX каждый будет запущен для каких-то спец. нужнд, т.е. необходимо их различать и перебор по имени, насколько я понимаю, не подойдет.
Старый 10.04.2008, 10:15   #4  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...создайте отдельный поток и вызовите WaitForSingleObject() с этим handle'ом и временем ожидания WAIT_INFINITE...
Кажется мне, что для аксапты проще каждый раз, как нада узнать завершился ли процесс, запускать WaitForSingleObject с временем ожидания 0. Если результат = WAIT_TIMEOUT, значит процесс еще работает.

З.Ы. В рамках тройки фраза "создайте отдельный поток" звучит интрегующе
Старый 10.04.2008, 15:53   #5  
Sergey_P is offline
Sergey_P
Участник
Сотрудники компании GMCS
 
10 / 11 (1) +
Регистрация: 30.08.2006
Вызвать в try cath какой-нибудь "безобидный" метод COM если упал в cath значит COM убит.
Старый 10.04.2008, 16:39   #6  
axaLearner is offline
axaLearner
Участник
 
88 / 17 (1) ++
Регистрация: 24.06.2004
Адрес: God knows
Try/catch не проходят - когда процесс уничтожен, попытка вызова метода на COM - объекте вызывает ошику времени выполнения, ту что со Stack Trace, с сообщением "COM object does not have method 'метод который пытаемся вызвать'".
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
E-mail в Аксапте 3.0 с помощью CDO.Message COM объекта custtable DAX: Программирование 4 12.02.2008 10:31
Передача агументов в функцию com объекта doo DAX: Программирование 34 30.01.2007 13:14
Проблема с получение коллекции (массива) из COM-объекта. VES DAX: Программирование 6 24.03.2006 18:59
Как получить конкретный интерфейс COM объекта Tony Green DAX: Программирование 20 02.12.2004 09:54

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:54.