Bug 828

Summary: КОМПАС зависает после закрытия окна документа
Product: [Поддержка проектов] КОМПАС 3D Reporter: Виталий Булгаков <bulgakov>
Component: ТестированиеAssignee: Илья Шпигорь <shpigor>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: normal    
Priority: P2 CC: baraka, kondratyuk, lav, mais, mx, pav, shpigor, vitperov
Version: v10   
Target Milestone: ---   
Hardware: PC   
OS: ALT Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 841    
Bug Blocks: 753, 1733, 3106    

Description Виталий Булгаков 2007-10-26 15:14:28 MSD
Запустить КОМПАС - Файл - Создать - Чертеж - Ок - Файл - Закрыть - чертеж закрывается, но остаются кнопки управления окном документа  (в одной строке с меню) - нажать на "крестик" - КОМПАС зависает, ни одна кнопка и меню в интерфейсе не работают
Comment 1 Виталий Перов 2008-09-20 15:06:36 MSD
Бактрейс с места падения.

Backtrace:
=>1 0x7bf8aa30 (0x0033f800)
  2 0x7ea74f03 call_window_proc+0x63(hwnd=<register EDI not in topmost frame>, msg=28, wp=0, lp=0, result=0x33f874, arg=0x7bf8aa30) [/home/vitperov/Projects/wine/dlls/user32/winproc.c:461] in user32 (0x0033f840)
  3 0x7ea788a5 CallWindowProcW+0x45(func=0x7bf8aa30, hwnd=0x2035a, msg=28, wParam=<register ESI not in topmost frame>, lParam=0) [/home/vitperov/Projects/wine/dlls/user32/winproc.c:2339] in user32 (0x0033f880)
  4 0x7288ebc7 in mfc42u (+0xebc7) (0x0033f8f4)
  5 0x7ea7482a WINPROC_wrapper+0x1a() in user32 (0x0033f924)
  6 0x7ea74f03 call_window_proc+0x63(hwnd=<register EDI not in topmost frame>, msg=28, wp=0, lp=0, result=0x33fa08, arg=0x7288eaac) [/home/vitperov/Projects/wine/dlls/user32/winproc.c:461] in user32 (0x0033f964)
  7 0x7ea79a56 WINPROC_call_window+0xe6(hwnd=<register EDI not in topmost frame>, msg=28, wParam=0, lParam=0, result=0x33fa08, unicode=1, mapping=1397020) [/home/vitperov/Projects/wine/dlls/user32/winproc.c:2215] in user32 (0x0033f9a4)
  8 0x7ea42db4 call_window_proc+0x84(hwnd=<register ESI not in topmost frame>, msg=<register EDI not in topmost frame>, wparam=0, lparam=0, unicode=1, same_thread=1, mapping=1397020) [/home/vitperov/Projects/wine/dlls/user32/message.c:1640] in user32 (0x0033fa14)
  9 0x7ea4694e send_message+0x1be(info=<register ESI not in topmost frame>, res_ptr=0x33faa0, unicode=<is not available>) [/home/vitperov/Projects/wine/dlls/user32/message.c:2465] in user32 (0x0033fa64)
  10 0x7ea46d7a SendMessageW+0x4a(hwnd=0x2035a, msg=28, wparam=0, lparam=0) [/home/vitperov/Projects/wine/dlls/user32/message.c:2588] in user32 (0x0033faa4)
  11 0x7ea27273 set_active_window+0x243(hwnd=(nil), prev=(nil), mouse=0, focus=1) [/home/vitperov/Projects/wine/dlls/user32/focus.c:144] in user32 (0x0033fb74)
  12 0x7ea27888 set_foreground_window+0xf8(hwnd=<register ESI not in topmost frame>, mouse=0) [/home/vitperov/Projects/wine/dlls/user32/focus.c:210] in user32 (0x0033fc14)
  13 0x7ea278e6 SetForegroundWindow+0x46(hwnd=<register ESI not in topmost frame>) [/home/vitperov/Projects/wine/dlls/user32/focus.c:312] in user32 (0x0033fc24)
  14 0x7e1d2f48 X11DRV_FocusOut+0x158(hwnd=<register EDI not in topmost frame>, xev=0x33fcd4) [/home/vitperov/Projects/wine/dlls/winex11.drv/event.c:688] in winex11 (0x0033fc64)
  15 0x7e1d384f process_events+0x30f(display=0x7c069970, filter=0x7e1d1520, arg=1279) [/home/vitperov/Projects/wine/dlls/winex11.drv/event.c:318] in winex11 (0x0033fda4)
  16 0x7e1d3e9b X11DRV_MsgWaitForMultipleObjectsEx+0xfb(count=1, handles=0x33fe04, timeout=4294967295, mask=1279, flags=<register ESI not in topmost frame>) [/home/vitperov/Projects/wine/dlls/winex11.drv/event.c:413] in winex11 (0x0033fdc4)
  17 0x7ea45a3a GetMessageW+0x7a(msg=0x43abac, hwnd=(nil), first=<register EDI not in topmost frame>, last=0) [/home/vitperov/Projects/wine/dlls/user32/message.c:2965] in user32 (0x0033fe14)
  18 0x728812b5 in mfc42u (+0x12b5) (0x0043abac)
  19 0x00000200 (0x00010034)
  20 0x00000000 (0x00000000)



Такое впечатление, что окно полностью не закрывается, и происходит обращение к уже освобождённой памяти 
Comment 2 Виталий Перов 2008-09-20 16:32:57 MSD
ещё багу можно воспроизвести не открывая элемента. Достаточно только 2 раза закрыть стартовое окно с выбором действия.
Первое нажатие на крестик - окно закрывается, но крестик остаётся
Второе нажатие - программа падает.

Последние строчки перед падением:
fixme:shdocvw:ClOleCommandTarget_Exec (0x49a5c14)->({000214d1-0000-0000-c000-000000000046} 84 0 (nil) 0x33fb34)
trace:graphics:DrawEdge 0x3bec (0,0)-(1262,819) 0005 200f
trace:graphics:DrawEdge 0xa104 (0,0)-(1254,792) 000a 200f
trace:graphics:DrawEdge 0xa104 (0,0)-(1254,792) 000a 200f
trace:graphics:DrawEdge 0x3bec (0,0)-(1288,981) 0005 200f
trace:graphics:DrawEdge 0x3bec (0,0)-(1288,981) 0005 200f
trace:graphics:DrawEdge 0x3bec (0,0)-(1288,981) 0005 200f
err:ole:ITypeInfo_fnInvoke did not find member id -514, flags 0x2!
err:ole:ITypeInfo_fnInvoke did not find member id -504, flags 0x2!
fixme:shdocvw:OleInPlaceObject_InPlaceDeactivate (0x49a5b78)
fixme:mshtml:HlinkTarget_SetBrowseContext (0x174dd8)->((nil))
fixme:shdocvw:OleObject_Close (0x49a5b78)->(1)

Но бактрейс совсем другой:
Backtrace:
=>1 0x00990001 in kcbu (+0xd0001) (0x00000000)
 
Comment 3 Виталий Перов 2008-09-20 17:00:14 MSD
При дальнейшем рассмотрении, OleObject_Close оказалась просто заглушкой, возвращающей E_NOTIMPL

Если возвращать S_OK, ничего не меняется.
Вызов в этом месте WebBrowser_OleObject_Destroy ничего не меняет
Вызов OleObject_Release приводит к падению при первом же закрытии
Comment 4 Константин Кондратюк 2009-01-26 11:04:29 MSK
OleObject_Close никогда никого не обижала ещё. Посмотри, пожалуйста, действительно ли с ней падение связано? Насколько я понимаю, непосредственно к уничтожению окна ole имеет весьма отдалённое отношение.
Comment 5 Илья Шпигорь 2009-07-14 15:17:51 MSD
Выложил патч.

Прболема в том, что главное окно Компаса не перерисовывается, поэтому меню не обновляется. На самом деле, после закрытия последнего максимизированного mdi окна эти кнопки должны пропадать.

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

Причина такого поведения в том, что Компас сам рисует системные кнопки в обход стандартному механизму mdi, и wine не может определить их наличие.

Патч добавляет функцию MDI_RefreshFrame, которая перерисовывает главное окно Компаса в случае, если при необходимости действий с системным меню, это меню не было обнаружено wine'ом.
Comment 6 Денис Баранов 2009-07-16 21:25:20 MSD
Принято.
WINE@Etersoft eter27/eter19