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


1C++ rocks!

Сообщений: 41
Зарегистрирован: 07. Ноября 2009
Вылеты Formex на Win2012r2
17. Июня 2020 :: 10:55
Печать  
Добрый день.
Всегда происходит вылет 1С с сообщением Память не может быть "read".

Воспроизводится на пустой конфигурации с одной строкой в ГМ ЗагрузитьВнешнююКомпоненту("Formex.dll").
Для воспроизведения проблемы нужно запустить 1С и не закрывая приложения завершить сеанс пользователя Windows (Пуск - Имя пользователя - Выйти).
Проверены версии Formex 2.0.5.108, 2.0.5.131, 2.0.5.148

Знаю что проект старый, но может у Альфа будет возможность исправить данный глюк...
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #1 - 17. Июня 2020 :: 17:13
Печать  
Стесняюсь спросить, а за чей счет банкет?

Количество версий винды стало зашкаливать, и это очень большая нагрузка на возможность поддерживать их все (на добровольных и бесплатных началах).
  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #2 - 18. Июня 2020 :: 05:59
Печать  
Если честно, я прям теряюсь. В принципе, если глюк проявляется только при завершении работы Windows без выхода из 1С, то это проблема с выгрузкой приложений из памяти. Видать снятие перехватов начинается в то время. когда винда уже принудительно выгрузила некоторые dll движка 1С.
Я просто даже не знаю что тут можно поправить.
  

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


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #3 - 18. Июня 2020 :: 10:06
Печать  
Нужно просто выгрузить formex и ошибки не будет.
Код
Выбрать все
Процедура ПриЗавершенииРаботыСистемы()
	Сервис=СоздатьОбъект("Сервис");
	Сервис.ВыгрузитьВнешнююКомпоненту("formex.dll");
КонецПроцедуры
 



Без этого крашится после
"CloseFile","D:\1C77\PPOrig\SYSLOG\links.tmp","SUCCESS",""
При чем тут links.tmp и где при перехвате это зацепили, найти будет сложно.

Это лог нормального завершения (что-то корежится текст, но более менее выправил)
Код
Выбрать все
1cv7s.exe,8684,QueryAttributeTaFile,SYSLOG_links.tmp,SUCCESS,Attributes: ANCI, ReparseTag: 0x0
tes: ANCI, ReparseTag: 0x0'
lags: FILE_DISPOSITION_DELETE, FILE_DISPOSITION_POSIX_SEMANTICS, FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK'
'1cv7s.exe','8684','FileSystemControl','SYSLOG_links.tmp','SUCCESS','Control: FSCTL_READ_FILE_USN_DATA'
'1cv7s.exe','8684','CloseFile','SYSLOG_links.tmp','SUCCESS',''
'1cv7s.exe','8684','RegQueryKey','HKLM','SUCCESS','Query: HandleTags, HandleTags: 0x0'
'1cv7s.exe','8684','RegQueryKey','HKLM','SUCCESS','Query: Name'
 


Интересно еще следующее:
ЗначениеИзСтрокиВнутр("{}"); в ПриЗавершенииРаботыСистемы вызывает тихий вылет из 1С без вызова дебагера, но при выходе из сеанса дебагер вызывается. Так что все становится еще более непонятно.
« Последняя редакция: 18. Июня 2020 :: 11:31 - Djelf »  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 63
Зарегистрирован: 06. Февраля 2019
Re: Вылеты Formex на Win2012r2
Ответ #4 - 18. Июня 2020 :: 13:41
Печать  
Djelf писал(а) 18. Июня 2020 :: 10:06:
Нужно просто выгрузить formex и ошибки не будет.
Код
Выбрать все
Процедура ПриЗавершенииРаботыСистемы()
	Сервис=СоздатьОбъект("Сервис");
	Сервис.ВыгрузитьВнешнююКомпоненту("formex.dll");
КонецПроцедуры
 





хм, у меня так вылетает просто при завершении 1С. тихо. потом просит переиндексацию.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #5 - 18. Июня 2020 :: 15:21
Печать  
Arbuz писал(а) 18. Июня 2020 :: 13:41:
хм, у меня так вылетает просто при завершении 1С. тихо. потом просит переиндексацию.

Ну да, ну да. Как еще по другому не знаю.
Разве что выводить предупреждение перед выходом, тогда винда скажет что сеанс не удалось закрыть и если ткнуть завершить 1с, то она завершится без окна с крашем.

ИМХО: Где-то память портится (это самая большая гадость из всех возможных гадостей) при таком завершении 1С.
Если при завершении работы чуток подождать, после вывода ошибки от 1с, и не нажимать ничего, то появится кнопка отмена, после отмены и возвращения рабочего стола, в окне краша 1с нажимаем "нет" и можно запустить отладку в VS.
VS пишет что краш в user32.dll!__InternalCallWinProc@20
Стэка вызова как такового нет.
Причем в списке библиотек, которые загружает VS, все ВК уже на этом момент уже выгружены.
Т.е. непонятно что и как ловить.
Разве что пересобирать formex (АЛьФ выкладывал недавно исходники) и в нем последовательно отключать хуки. Занятие не для слабонервных  Со сжатыми губами
« Последняя редакция: 18. Июня 2020 :: 16:46 - Djelf »  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 63
Зарегистрирован: 06. Февраля 2019
Re: Вылеты Formex на Win2012r2
Ответ #6 - 19. Июня 2020 :: 10:35
Печать  
ЕМНИП это очень старая проблема. и ИМХО кроется она не в самом(их) ВК как таковом, а в корявом коде 1С при выгрузке ВК. видимо остаются какие-то указатели на уже несуществующие объекты.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #7 - 19. Июня 2020 :: 15:09
Печать  
Arbuz писал(а) 19. Июня 2020 :: 10:35:
ЕМНИП это очень старая проблема. и ИМХО кроется она не в самом(их) ВК как таковом, а в корявом коде 1С при выгрузке ВК. видимо остаются какие-то указатели на уже несуществующие объекты.

Увы, нет. С 1с++, йоксель, 1sqlite этой проблемы нет.
5с у меня в Предупреждение убрало сообщение, а переиндексация на копии не нужна, мне не сложно нажать отмену.

Вопрос: а зачем вы выходите из системы? И как часто.
Я понимаю что это в силе Джобса "Просто не держите его так", но все таки?
  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #8 - 22. Июня 2020 :: 08:47
Печать  
А 1с-ное ЗавершениеРаботыСистемы успевает отработать до вылета? Может сделать отдельный метод отключения перехватов?
  

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


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #9 - 22. Июня 2020 :: 10:06
Печать  
АЛьФ писал(а) 22. Июня 2020 :: 08:47:
А 1с-ное ЗавершениеРаботыСистемы успевает отработать до вылета? Может сделать отдельный метод отключения перехватов?

Да, ЗавершениеРаботыСистемы работает.

Ну, я нашел в чем причина. Вылет тут:
Код (C++)
Выбрать все
LRESULT CALLBACK newMainWndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
		case WM_COMMAND:
		{
			if(FormEx_OnCommand(wParam,lParam)) return 0;
			break;
		} 


Теоретически, должно было бы сработать добавление туда восстановления перехвата, но, зараза, при выходе из системы это не работает.
Код (C++)
Выбрать все
        case WM_DESTROY:
        {
            ::SetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC,(LONG)hMainWndProc);
            break;
        } 


Если отключить этот перехват то ошибки нет.
Код (C++)
Выбрать все
::SetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC,(LONG)newMainWndProc); 


Ерунда какая то, получается, что dll formex`а при выходе из системы выгружается до WM_DESTROY, и даже код в void CInitFormEx : : Destroy(void) не выполняется.
  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #10 - 22. Июня 2020 :: 13:39
Печать  
И с этим разобрался. Вот так (у меня на W10x64) работает без ошибок при логауте:
Код (C++)
Выбрать все
InitFormEx.cpp

LRESULT CALLBACK newMainWndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
    switch(nMessage) {
+       case WM_DESTROY: // пусть будет, вдруг где-то сработает и что-то пойдет потом не так
+       case WM_ENDSESSION: // работает начиная с WinXP
+       {
+            ::SetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC,(LONG)hMainWndProc);
+           return 0;
+       }
        case WM_SETCURSOR: 


2all Проверяйте на тестовом formex_141 https://cloud.mail.ru/public/4ES5/3uJzAqdxz
« Последняя редакция: 22. Июня 2020 :: 15:25 - Djelf »  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #11 - 23. Июня 2020 :: 05:25
Печать  
Добавил это исправление. После подтверждения выложу новую сборку.
  

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


1C++ rocks!

Сообщений: 63
Зарегистрирован: 06. Февраля 2019
Re: Вылеты Formex на Win2012r2
Ответ #12 - 23. Июня 2020 :: 12:42
Печать  
Djelf писал(а) 19. Июня 2020 :: 15:09:
Вопрос: а зачем вы выходите из системы? И как часто.
Я понимаю что это в силе Джобса "Просто не держите его так", но все таки?


Такое случается и при завершении работы, но не всегда. Так-то люди приучены сначала закрывать 1с, и только потом завершение или выход, но иногда забывают.


Djelf писал(а) 22. Июня 2020 :: 13:39:
2all Проверяйте на тестовом formex_141 https://cloud.mail.ru/public/4ES5/3uJzAqdxz


Увы нет. то же самое - требует переиндексацию, если выйти не закрыв 1с.
тщательно проверил, что загружена именно эта, 141. win7 x86
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #13 - 23. Июня 2020 :: 13:32
Печать  
Arbuz писал(а) 23. Июня 2020 :: 12:42:
Увы нет. то же самое - требует переиндексацию, если выйти не закрыв 1с.
тщательно проверил, что загружена именно эта, 141. win7 x86

Этот патч убирает только крэш 1С, что и просил Noy.
formex не снимал перехват окна.
Сейчас поведение стало более корректное, хотя и с запросом на переиндексацию.
А вот выгрузка formex это была плохая идея, сам себя он никогда не сможет выгрузить Подмигивание

На самом деле не все так просто, вот тут разжевано как следует: http://www.manhunter.ru/assembler/1088_perehvat_i_blokirovka_zaversheniya_raboti...

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

А что мешает, так это то что при любом таком тесте закрываются все компиляторы, отладчики и вообще все что запущено.
На повторное открытие и следующий эксперимент тратится невероятное количество лишнего времени  Злой
И вообще не видно, что на самом деле происходит, окон сообщений то нет!
  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Вылеты Formex на Win2012r2
Ответ #14 - 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С не закрывается, а после отмены логаута отваливаются события ПриПолученииКомандыГлавнымОкном и ПриПолученииСистемнойКомандыГлавнымОкном.
Это я не знаю как восстановить, может АЛьФ что-то придумает.
Предполагаю, нужно перехватывать окончание события ПриЗавершенииРаботыСистемы и, в зависимости от СтатусВозврата, восстанавливать перехват.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать