Программа для работы с налоговой отчетностью: http://sbis.ru/download/2.1/sbis-setup-eo-nokladr.exe Зависание при обращении к календарю. Происходит только при клике мышкой в число на календаре. Это очень неприятно, но работа возможна, если указывать дату с клавиатуры.
При запуске через wine-origin получаем такой backtrace: Backtrace: =>1 0x7ee489f5 INSTR_EmulateInstruction+0x65(rec=0x34d8d8, context=0x34d60c) [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:454] in kernel32 (0x0034d4ec) 2 0x7ee49e6c INSTR_vectored_handler+0x5c(ptrs=0x34d554) [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:890] in kernel32 (0x0034d51c) 3 0x7ef9ffe2 raise_exception+0x112(rec=0x34d8d8, context=0x34d60c, first_chance=<is not available>) [/net/wine/Projects/wine-origin/dlls/ntdll/exception.c:233] in ntdll (0x0034d56c) 4 0x7efa03c6 __regs_RtlRaiseException+0x26(rec=0x34d8d8, context=0x34d60c) [/net/wine/Projects/wine-origin/dlls/ntdll/exception.c:380] in ntdll (0x0034d5cc) 5 0x7efc4054 raise_segv_exception+0x34(rec=<register ESI not in topmost frame>, context=<register EDI not in topmost frame>) [/net/wine/Projects/wine-origin/dlls/ntdll/signal_i386.c:1001] in ntdll (0x0034d5fc) 6 0xdeadbabe (0x0034fcac) 7 0x00403941 in sbis (+0x3941) (0x0034fe60) 8 0x00404a80 in sbis (+0x4a80) (0x0034ff08) 9 0x7ee67f10 start_process+0xc0(arg=0x0) [/net/wine/Projects/wine-origin/dlls/kernel32/process.c:820] in kernel32 (0x0034ffe8) 10 0xb7dfa677 wine_switch_to_stack+0x17() in libwine.so.1 (0x00000000) 0x7ee489f5 INSTR_EmulateInstruction+0x65 [/net/wine/Projects/wine-origin/dlls/kernel32/instr.c:454] in kernel32: movb 0x0(%edi,%edx,1),%al Unable to open file '/net/wine/Projects/wine-origin/dlls/kernel32/instr.c' Или stack overflow при запуске через wine
Как мне кажется, происходит генерация исключения при старте процесса. Нужно обратиться к разработчикам СБИС за консультацией.
Created attachment 98 [details] Лог по msg, win и process
Конкретное решение под СБИС++ найдено
В функции MONTHCAL_LButtonDown при условии клика в дату (MCHT_CALENDARDATE) не посылется сообщение WM_NOTIFY родителю в случае, если класс контрола, обрабатывающего клик - "Календарь", внутренний класс СБИС.
Данное решение некорректно. Ломает работу календаря. Откладываю данный хак и переоткрываю.
на данный момент ведется работа по исправлению мелких интерфейсных багов всех контролов работающих с временем, датой...
1. Нужны тесты по поднятой теме 2. Надо проверить на новой версии программы 3. Плавно исправить к новой версии
Удалось воспроизвести в новой версии СБИС++ 2.2.130 Backtrace: =>1 0xb7dc35b6 strlen+0x26() in libc.so.6 (0x7fdef658) 2 0x7f8965e0 ShellExecuteExA+0x250() in shell32 (0x7fdef6d8)
Нужно посмотреть при работе над 1.0.10
eter35\13: wine: Unhandled page fault on read access to 0x7cf9f3e7 at address 0xb7d64156 (thread 0009), starting debugger... Unhandled exception: page fault on read access to 0x7cf9f3e7 in 32-bit code (0xb7d64156). Register dump: CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b EIP:b7d64156 ESP:0032f634 EBP:0032f670 EFLAGS:00010206( - 00 - RIP1) EAX:7cf9f3e7 EBX:7b8b3c1c ECX:00000003 EDX:00000003 ESI:00000000 EDI:ffffffff Stack dump: 0x0032f634: 7b85fa14 7cf9f3e7 00000000 00000000 0x0032f644: 00000000 00000000 00000000 00000000 0x0032f654: 7bc636bb 7ed54c50 104f3d28 0032f6bc 0x0032f664: 7e9d42c0 104f3d28 7cf9f3e7 0032f6f0 0x0032f674: 7e9a58e8 00000000 00000000 7cf9f3e7 0x0032f684: ffffffff 00000000 00000000 00070030 Backtrace: =>1 0xb7d64156 strlen+0x26() in libc.so.6 (0x0032f670) 2 0x7e9a58e8 ShellExecuteExA+0xb8() in shell32 (0x0032f6f0)
wine@etersoft 1.0.12 eter5.2/4 Сбис версия 2.3.37. Открыл календарь попробовал выбрать любую дату и программа зависла.
Обсуждение с разработчиками: http://forum.sbis.ru/viewtopic.php?f=3&t=15093
WINE@Etersoft 1.0 SQL 2.0.0-eter0.12/2 Воспроизводится.
По мотивам исследования Пети (коммент #5)... В функции MONTHCAL_LButtonDown при обработке сообщения MCHT_CALENDARDATE всё так же есть код, выполнение которого связано с падением. Судя по всему, падения - это последствия: infoPtr->status = MC_SEL_LBUTDOWN; На первый взгляд, обработка MC_SEL_LBUTDOWN есть только в MONTHCAL_MouseMove(): if(!(infoPtr->status & MC_SEL_LBUTDOWN)) return 0;
Статус MC_SEL_LBUTDOWN обрабатывается самой программой, конечно, а не вайном.
СБиС++ ЭО создаёт окно календаря и устанавливает свою оконную процедуру (fffffffc = -4 = GWL_WNDPROC): 003f:Call user32.CreateWindowExA(00000000,0091dc18 "SysMonthCal32",10096308 "",44810001,00000000,00000000,000000d0,000000d2,0009020c,00000000,00400000,00000000) ret=00766596 ...................... 003f:Ret user32.CreateWindowExA() retval=000f002c ret=00766596 003f:Call user32.GetClassLongA(000f002c,ffffffe8) ret=007665dc 003f:Ret user32.GetClassLongA() retval=ffff0016 ret=007665dc 003f:Call user32.SetWindowLongA(000f002c,fffffffc,00762f50) ret=00763400 003f:Ret user32.SetWindowLongA() retval=ffff0016 ret=00763400 После щелчка мышью на дате происходит падение внутри этой процедуры: 003f:Call window proc 0x762f50 (hwnd=0x9020c,msg=WM_NOTIFY,wp=00000000,lp=0032e094) ...................... 003f:Call user32.GetWindow(000f002c,00000002) ret=005a895a 003f:Ret user32.GetWindow() retval=00080276 ret=005a895a 003f:Call user32.GetWindow(00080276,00000002) ret=005a895a 003f:Ret user32.GetWindow() retval=00000000 ret=005a895a err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x512de1
(В ответ на comment #0) > Программа для работы с налоговой отчетностью: > http://sbis.ru/download/2.1/sbis-setup-eo-nokladr.exe > > Зависание при обращении к календарю. Происходит только при клике мышкой в число > на календаре. Это очень неприятно, но работа возможна, если указывать дату с > клавиатуры. Зависание происходит не только при выборе числа, но и при попытке изменить месяц или год. С "comctl32=n" (версии 6.0) проблемы нет. Хотя есть мелкий дефект перерисовки, но видимо он не относится к задаче.
Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем структуры NMSELCHANGE заполняется перед вызовом корректно.
(В ответ на comment #23) > Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и > MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем > структуры NMSELCHANGE заполняется перед вызовом корректно. Эти функции вызывают зависание при вызове из разнообразных мест системной оконной процедуры. В логах оконных сообщений под Windows ничего особенного нет.
(В ответ на comment #23) > Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и > MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем > структуры NMSELCHANGE заполняется перед вызовом корректно. Кажется ошибка именно здесь. В Windows член stSelEnd забивается нулями перед посылкой WM_NOTIFY если у календаря не установлен бит MCS_MULTISELECT. В Вайне же в него всегда записывается некоторая дата. Обнуление указанной выше структуры решает проблему.
(В ответ на comment #25) > (В ответ на comment #23) > > Проблема не наблюдается если в MONTHCAL_NotifySelectionChange() и > > MONTHCAL_NotifySelect() закомментировать вызовы SendMessageW(). Причем > > структуры NMSELCHANGE заполняется перед вызовом корректно. > > Кажется ошибка именно здесь. В Windows член stSelEnd забивается нулями перед > посылкой WM_NOTIFY если у календаря не установлен бит MCS_MULTISELECT. В Вайне > же в него всегда записывается некоторая дата. > Обнуление указанной выше структуры решает проблему. Для проверки на СБИС запущенном в Windows скопировал stSelStart в stSelEnd перед обработкой сообщения. Результат - немедленный acess violation on write где-то внутри muzzle.dll. Думаю выводы очевидны.
Сделал тест и соответствующее исправление, отправил на winehq.org
(В ответ на comment #27) > Сделал тест и соответствующее исправление, отправил на winehq.org Тесты прошли с ошибками. Исправил и отправил повторно. http://www.winehq.org/pipermail/wine-patches/2012-August/117044.html http://www.winehq.org/pipermail/wine-patches/2012-August/117045.html
(В ответ на comment #28) > (В ответ на comment #27) > > Сделал тест и соответствующее исправление, отправил на winehq.org > > Тесты прошли с ошибками. Исправил и отправил повторно. > http://www.winehq.org/pipermail/wine-patches/2012-August/117044.html > http://www.winehq.org/pipermail/wine-patches/2012-August/117045.html Патчи приняты, отправил в eter-2.0.0. Можно проверить решение.
Например: СБИС - календарь налогоплательщика - ОСН - далее - действует с - нажимаем значек календаря(таблицы) - выбираем любую дату. Зависаний нет, работает корректно. wine@eter-2 bottle sbis/2.4.43 WINE@Etersoft SQL 2.0.2-eter15/3