Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Вылеты Formex на Win2012r2 (число прочтений - 3242 )
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 06. Февраля 2019
Re: Вылеты Formex на Win2012r2
Ответ #15 - 24. Июня 2020 :: 10:51
Печать  
Djelf писал(а) 23. Июня 2020 :: 13:32:
Этот патч убирает только крэш 1С, что и просил Noy.
formex не снимал перехват окна.
Сейчас поведение стало более корректное, хотя и с запросом на переиндексацию.
А вот выгрузка formex это была плохая идея, сам себя он никогда не сможет выгрузить Подмигивание

я, похоже, чего-то не понимаю. если требует переиндексацию, значит крэшится? или только с окном ошибки, а тихий вылет не крэш? и формекс я не выгружаю, хотя попробовал  Улыбка

Djelf писал(а) 23. Июня 2020 :: 13:32:
На самом деле не все так просто, вот тут разжевано как следует: http://www.manhunter.ru/assembler/1088_perehvat_i_blokirovka_zaversheniya_raboti...

спасибо, логика ваших патчей стала понятна  Очень довольный
и у меня есть много примеров софта который некорректно работает после отмены завершения системы.

Djelf писал(а) 23. Июня 2020 :: 13:32:
Мне вопрос о переиндексации не мешает (поэтому я это и не заметил).
Завершать приложения работающие с БД таким образом не очень хорошая идея, если важна целостность.
На самом деле правильным поведением было бы вообще заблокировать выход из 7ки до ее завершения.
А еще могут быть отрыты документы, модальные окна и т.д. и т.п. и все это тоже должно не дать закрыться 1С корректно.
Так что тут выбор не велик - или блокировать завершение, или как то вот так...

есть ещё вариант: ловить событие завершения в 1С. я, правда, не знаю насколько трудоёмко создать такое, с учётом всех условий, вроде отмены выхода третьей стороной.
будет ловить ПриПолученииКомандыГлавнымОкном (или ПриПолученииСистемнойКомандыГлавнымОкном?)  WM_QUERYENDSESSION? тогда дать подзатыльникзакрыть все окна и завершиться без вопросов.

Djelf писал(а) 23. Июня 2020 :: 13:32:
А что мешает, так это то что при любом таком тесте закрываются все компиляторы, отладчики и вообще все что запущено.
На повторное открытие и следующий эксперимент тратится невероятное количество лишнего времени  Злой
И вообще не видно, что на самом деле происходит, окон сообщений то нет!

я вообще не понимаю как вы это дебажите  Ужас

Djelf писал(а) 23. Июня 2020 :: 15:24:
Еще одна попытка.
Второй тестовый: https://cloud.mail.ru/public/4ES5/3uJzAqdxz
Код (C++)
Выбрать все
    switch(nMessage) {
        case WM_QUERYENDSESSION:{
            ::SetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC,(LONG)hMainWndProc);
            break;
        } 


Переиндексацию перестал требовать.

Но! Если в ПриЗавершенииРаботыСистемы вывести вопрос или предупреждение, то 1С не закрывается, а после отмены логаута отваливаются события ПриПолученииКомандыГлавнымОкном и ПриПолученииСистемнойКомандыГлавнымОкном.
Это я не знаю как восстановить, может АЛьФ что-то придумает.
Предполагаю, нужно перехватывать окончание события ПриЗавершенииРаботыСистемы и, в зависимости от СтатусВозврата, восстанавливать перехват.

может можно сделать метод формекс снять/установить перехват и в ПриЗавершенииРаботыСистемы снимать перехват, а если надо потом устанавливать. или так не будет работать?


добавлено: Подтвеждаю, последний патч решает проблему некорректного завершения 1С при завершении_системы/выходе_сеанса, при условии отсутствия висящих окон вопросов, но это решается таймаутом этих окон.

добавлено: и очень бы хотелось ловить WM_QUERYENDSESSION в 1С
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #16 - 24. Июня 2020 :: 11:28
Печать  
Arbuz писал(а) 24. Июня 2020 :: 10:51:
я вообще не понимаю как вы это дебажите  Ужас

Где краш поймать было относительно легко, нужно было скомпилировать formex с отладкой, открыть его в гидре вместе с pdb и перейти по адресу краша.
А дальше методом размышлений и тыка  Смех

Arbuz писал(а) 24. Июня 2020 :: 10:51:
может можно сделать метод формекс снять/установить перехват и в ПриЗавершенииРаботыСистемы снимать перехват, а если надо потом устанавливать. или так не будет работать?

Нет, нужен внутренний, скрытый метод formex ПослеОбработкиЗавершенииРаботыСистемы который бы это и восстанавливал.

p.s. Наверное сложно будет такой перехват сделать. Не понимаю где и как  Нерешительный
Но если в ПриЗавершенииРаботыСистемы перехватывать заново, каким то новым методом в Сервисе, это сработает и это значительно проще в реализации.
« Последняя редакция: 24. Июня 2020 :: 15:01 - Djelf »  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1537
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #17 - 26. Июня 2020 :: 06:36
Печать  
Djelf писал(а) 24. Июня 2020 :: 11:28:
Нет, нужен внутренний, скрытый метод formex ПослеОбработкиЗавершенииРаботыСистемы который бы это и восстанавливал.

p.s. Наверное сложно будет такой перехват сделать. Не понимаю где и как  Нерешительный
Но если в ПриЗавершенииРаботыСистемы перехватывать заново, каким то новым методом в Сервисе, это сработает и это значительно проще в реализации.


Предполагаю, что самым простым будет перехватить CBLModule7::ExecProc и там отрабатывать нужные действия, если первым параметром передано 0х0A45.

И вдруг пришла мысля, что при использовании 1С++ можно ничего в FormEx и не перехватывать, а использовать класс "Перехватчик".
  

FormEx developer
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #18 - 26. Июня 2020 :: 07:32
Печать  
АЛьФ писал(а) 26. Июня 2020 :: 06:36:
Предполагаю, что самым простым будет перехватить CBLModule7::ExecProc и там отрабатывать нужные действия, если первым параметром передано 0х0A45.

Ага! Вот он где статус возврата спрятался.

Может не там, а на CBLModule7 :: OnExitProc поставить?
Не хотелось бы Перехватчик сломать  Круглые глаза

p.s. зачем же они так сделали? уже имея пкод, сначала ищут символьное представление, а затем по символьному уже процедуру... чудно...
  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1537
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #19 - 26. Июня 2020 :: 08:46
Печать  
А в OnExitProc мы определим что это нужная нам процедура закончилась? Сейчас просто голова совсем другим занята.
  

FormEx developer
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #20 - 26. Июня 2020 :: 09:11
Печать  
АЛьФ писал(а) 26. Июня 2020 :: 08:46:
А в OnExitProc мы определим что это нужная нам процедура закончилась? Сейчас просто голова совсем другим занята.

Насколько я понимаю, да. Определение такое:
void __thiscall OnExitProc(CBLModule7 *this,int iPCode)
Но надо проверить, возможно что OnEnterProc и OnExitProc выполняются только в отладчике.
upd: испортил код в OnEnterProc - вылет в режиме предприятия, значит туда попадает и должно сработать.
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #21 - 26. Июня 2020 :: 12:10
Печать  
Извините за ОффТоп. Альф, посмотри плиз соседнюю ветку, там где вылет в окне открытия файла по ПКМ.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать