Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Убийство парковочного окна / 21 сообщений из 21, страница 1 из 1
30.11.2020, 15:19
    #40023372
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Есть мой ocx. При завершении приложения, которое его использует, вылетает исключениеProject MyProject.exe faulted with message: 'system exception (code 0xc000041d) at 0x76034662'. Process Stopped. Use Step or Run to continue.Причина в финализации модуля AxCtrls
Код: pascal
1.
2.
3.
4.
5.
6.
7.
finalization
  if xParkingWindow <> 0 then
  begin
    SendMessage(xParkingWindow, WM_CLOSE, 0, 0);
    Winapi.Windows.UnregisterClass('DAXParkingWindow', HInstance);
  end;
  if OlePro32DLL <> 0 then FreeLibrary(OlePro32DLL);

вылетает на посылке окну WM_CLOSE. При этом получается дикий стек
:76034662 KERNELBASE.RaiseException + 0x62
:71fa600c ; C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
:72093e55 ; C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
:71c9f1aa ; C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
:75d247ab user32.AddClipboardFormatListener + 0x4b
:75d052ac ; C:\Windows\SysWOW64\user32.dll
:75d04e4a ; C:\Windows\SysWOW64\user32.dll
:75d0e4cf ; C:\Windows\SysWOW64\user32.dll
:7732537d ntdll.KiUserCallbackDispatcher + 0x4d
:75d06884 ; C:\Windows\SysWOW64\user32.dll
Vcl.AxCtrls.ParkingWindowProc(???,???,???,???)
:75d247ab user32.AddClipboardFormatListener + 0x4b
:75d052ac ; C:\Windows\SysWOW64\user32.dll
:75d04a5d ; C:\Windows\SysWOW64\user32.dll
:75d04723 ; C:\Windows\SysWOW64\user32.dll
Vcl.AxCtrls.Finalization
Какой AddClipboardFormatListener на закрытие окна?

Саму ошибку я обошел, вызвав
Код: pascal
1.
SendMessage(xParkingWindow, WM_CLOSE, 0, 0);

в деструкторе ActiveX контрола. А вопрос - откуда ошибка? Что происходит?

Само окно создается так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function ParkingWindow: HWND;
var
  TempClass: TWndClass;
begin
  Result := xParkingWindow;
  if Result <> 0 then Exit;

  if GetClassInfo(HInstance, 'DAXParkingWindow', TempClass) and
    (TempClass.lpfnWndProc <> @ParkingWindowProc) and
    not Winapi.Windows.UnregisterClass('DAXParkingWindow', HInstance) then
      RaiseLastOSError;

  FillChar(TempClass, sizeof(TempClass), 0);
  if not GetClassInfo(HInstance, 'DAXParkingWindow', TempClass) then
  begin
    TempClass.hInstance := HInstance;
    TempClass.lpfnWndProc := @ParkingWindowProc;
    TempClass.lpszClassName := 'DAXParkingWindow';
    if Winapi.Windows.RegisterClass(TempClass) = 0 then
      raise EOutOfResources.Create(SWindowClass);
  end;
  xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,
    WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,
    GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);
  SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW
    or SWP_NOZORDER or SWP_SHOWWINDOW);
  Result := xParkingWindow;
end;

и оконная процедура
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function ParkingWindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  ControlWnd: HWND;
begin
  case Msg of
    WM_COMPAREITEM, WM_DELETEITEM, WM_DRAWITEM, WM_MEASUREITEM, WM_COMMAND:
      begin
        case Msg of
          WM_COMPAREITEM: ControlWnd := PCompareItemStruct(lParam).CtlID;
          WM_DELETEITEM:  ControlWnd := PDeleteItemStruct(lParam).CtlID;
          WM_DRAWITEM:    ControlWnd := PDrawItemStruct(lParam).CtlID;
          WM_MEASUREITEM: ControlWnd := PMeasureItemStruct(lParam).CtlID;
          WM_COMMAND:     ControlWnd := HWND(lParam);
        else
          Result := 0;
          Exit;
        end;
        Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
      end;
  else
    if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then xParkingWindow := 0;
    Result := DefWindowProc(Wnd, Msg, WParam, LParam);
  end;
end;

Чувствую, что проблема именно из-за отсылки сообщения из секции финализации

С уважением, Vasilisk
...
Рейтинг: 0 / 0
30.11.2020, 15:30
    #40023376
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
_Vasilisk_увствую, что проблема именно из-за отсылки сообщения из секции финализации

Насколько я в курсе, эти секции в DLL выполняются из DllMain, а там туева хуча запрещённых
действий, включая посылку сообщений.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.11.2020, 17:22
    #40023424
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Dimitry Sibiryakov
эти секции в DLL выполняются из DllMain, а там туева хуча запрещённых действий
Если поставить точку останова, а потом начать пошаговое выполнение, то ошибки нет. Я так понимаю, что-то происходит в соседних потоках и на это влияет обработка сообщения
...
Рейтинг: 0 / 0
30.11.2020, 19:16
    #40023460
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Тупо "подождать" (таймаутом или Wait) не пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.11.2020, 21:08
    #40023469
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Гаджимурадов Рустам
Тупо "подождать" (таймаутом или Wait) не пробовал?
Sleep в деструкторе TActiveXControl не помогает. Wait не понятно на что делать
...
Рейтинг: 0 / 0
30.11.2020, 22:48
    #40023487
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
_Vasilisk_> Sleep в деструкторе TActiveXControl не помогает.

Большой промежуток тоже?

Про Wait думать надо, только если
дело в отложке (скажем, ждать ответа).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.11.2020, 23:01
    #40023490
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
_Vasilisk_
Какой AddClipboardFormatListener на закрытие окна?


Не обращай внимания, у Delphi нет отладочной инфы для user32 и она просто берёт "ближайший" экспорт. Скорее всего, там вызывается какая-то внутренняя функция user32.

0xc000041d - это STATUS_FATAL_USER_CALLBACK_EXCEPTION "An unhandled exception was encountered during a user callback."

Стек твой выглядит вообще просто:
7. второе исключение / STATUS_FATAL_USER_CALLBACK_EXCEPTION
... тут не интересно
6. user32.dll
5. ntdll.KiUserCallbackDispatcher
4. user32.dll - исключение тут
3. Vcl.AxCtrls.ParkingWindowProc - обрабатывает WM_CLOSE
2. user32.dll .... много
1. Vcl.AxCtrls.Finalization - отправляет WM_CLOSE

Короче, смотри по коду, что делает Vcl.AxCtrls.ParkingWindowProc - дважды щёлкни по ней.
...
Рейтинг: 0 / 0
01.12.2020, 15:17
    #40023655
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
GunSmoker
Короче, смотри по коду, что делает Vcl.AxCtrls.ParkingWindowProc
Я привел ее текст в первом посте.
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function ParkingWindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  ControlWnd: HWND;
begin
  case Msg of
    WM_COMPAREITEM, WM_DELETEITEM, WM_DRAWITEM, WM_MEASUREITEM, WM_COMMAND:
      begin
        case Msg of
          WM_COMPAREITEM: ControlWnd := PCompareItemStruct(lParam).CtlID;
          WM_DELETEITEM:  ControlWnd := PDeleteItemStruct(lParam).CtlID;
          WM_DRAWITEM:    ControlWnd := PDrawItemStruct(lParam).CtlID;
          WM_MEASUREITEM: ControlWnd := PMeasureItemStruct(lParam).CtlID;
          WM_COMMAND:     ControlWnd := HWND(lParam);
        else
          Result := 0;
          Exit;
        end;
        Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
      end;
  else
    if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then xParkingWindow := 0;
    Result := DefWindowProc(Wnd, Msg, WParam, LParam);
  end;
end;


Тут ничего военного. Отладчиком последовательно захожу и вижу WM_CLOSE, WM_POSCHANGING, WM_POS_CHANGED, WM_DESTROY, WM_NCDESTROY
...
Рейтинг: 0 / 0
01.12.2020, 15:19
    #40023656
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Гаджимурадов Рустам
Большой промежуток тоже?
Да. Именно его и смотрел. 5 секунд ставил
...
Рейтинг: 0 / 0
01.12.2020, 15:20
    #40023658
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
_Vasilisk_Я привел ее текст в первом посте.

Добавь в неё try-except с протоколированием пойманного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.12.2020, 15:21
    #40023659
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
GunSmoker
3. Vcl.AxCtrls.ParkingWindowProc - обрабатывает WM_CLOSE
Тут я бы не был так уверен
...
Рейтинг: 0 / 0
01.12.2020, 16:17
    #40023685
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Добавил логирование сообщений, какие приходят в оконную функцию после посылки WM_CLOSE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
>>> 16 (WM_CLOSE)
  >>> 144 (???)
  <<< 144 (???)
  >>> 70 (WM_WINDOWPOSCHANGING)
  <<< 70 (WM_WINDOWPOSCHANGING)
  >>> 71 (WM_WINDOWPOSCHANGED)
  <<< 71 (WM_WINDOWPOSCHANGED)
  >>> 134 (WM_NCACTIVATE)
  <<< 134 (WM_NCACTIVATE)
  >>> 6 (WM_ACTIVATE)
  <<< 6 (WM_ACTIVATE)
  >>> 28 (WM_ACTIVATEAPP)
  <<< 28 (WM_ACTIVATEAPP)
>>> - вход в функцию, <<< - выход
...
Рейтинг: 0 / 0
02.12.2020, 13:21
    #40023941
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Ну так на каком сообщении валится-то?
...
Рейтинг: 0 / 0
02.12.2020, 15:20
    #40023979
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
GunSmoker
Ну так на каком сообщении валится-то?
После выхода из обработки WM_ACTIVATEAPP.

Т.е. WM_CLOSE провоцирует отправку каскада сообщений, и исключение происходит до выхода из обработки WM_CLOSE
...
Рейтинг: 0 / 0
02.12.2020, 16:00
    #40023997
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Т.е. получается

ntdll.KiUserCallbackDispatcher
user32.dll
Vcl.AxCtrls.ParkingWindowProc(WM_CLOSE)
user32.dll
Vcl.AxCtrls.Finalization

?

У тебя трейсер исключений подключен? Можешь посмотреть, что за исключение-то? Или можно точку останова на KiUserCallbackDispatcher поставить.
...
Рейтинг: 0 / 0
02.12.2020, 21:45
    #40024069
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
GunSmoker
Т.е. получается
Да
GunSmoker
У тебя трейсер исключений подключен?
Это из Eureka? У меня ее нет
GunSmoker
Или можно точку останова на KiUserCallbackDispatcher поставить.
Завтра сделаю
...
Рейтинг: 0 / 0
03.12.2020, 12:38
    #40024199
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
GunSmoker
Или можно точку останова на KiUserCallbackDispatcher поставить.
Уходит в недра user32

Вот, кстати, полная последовательность сообщений на обработку WM_CLOSE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
>>> 16 (WM_CLOSE)
  >>> 144 (???)
  <<< 144 (???)
  >>> 70 (WM_WINDOWPOSCHANGING)
  <<< 70 (WM_WINDOWPOSCHANGING)
  >>> 71 (WM_WINDOWPOSCHANGED)
  <<< 71 (WM_WINDOWPOSCHANGED)
  >>> 134 (WM_NCACTIVATE)
  <<< 134 (WM_NCACTIVATE)
  >>> 6 (WM_ACTIVATE)
  <<< 6 (WM_ACTIVATE)
  >>> 28 (WM_ACTIVATEAPP)
  <<< 28 (WM_ACTIVATEAPP)
---------- Здесь исключение при посылке из Finalization
  >>> 8 (WM_KILLFOCUS)
  <<< 8 (WM_KILLFOCUS)
  >>> 641 (WM_IME_SETCONTEXT)
    >>> 642 (WM_IME_NOTIFY)
    <<< 642 (WM_IME_NOTIFY)
  <<< 641 (WM_IME_SETCONTEXT)
  >>> 2 (WM_DESTROY)
  <<< 2 (WM_DESTROY)
  >>> 130 (WM_NCDESTROY)
  <<< 130 (WM_NCDESTROY)
<<< 16 (WM_CLOSE)
...
Рейтинг: 0 / 0
03.12.2020, 12:59
    #40024205
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Dimitry Sibiryakov
Добавь в неё try-except с протоколированием пойманного.
Не заметил этого сообщения.

Если добавить try ... except в оконную функцию, то в секцию except код не заходит. Хотя возникает каскад 0xc000041d. clr.dll в вершине стека наводит на мысль, что проблема в кривом .net модуле, который используется у меня в программе и где просто (это мое предположение исходя из опыта общения с разработчиком этого модуля) куча такого кода
Код: c#
1.
2.
3.
try {
  ........
} catch {}

Т.е. исключение гасится внутри сборки, а вижу я его только в отладчике
...
Рейтинг: 0 / 0
03.12.2020, 13:53
    #40024221
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
_Vasilisk_
GunSmoker
Или можно точку останова на KiUserCallbackDispatcher поставить.
Уходит в недра user32

Я имел в виду параметры посмотреть. В KiUserCallbackDispatcher передаётся EXCEPTION_RECORD и CONTEXT. Что в EXCEPTION_RECORD? C0000005?
...
Рейтинг: 0 / 0
03.12.2020, 14:04
    #40024226
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Пардон, попутал KiUserCallbackDispatcher с KiUserExceptionDispatcher...
...
Рейтинг: 0 / 0
03.12.2020, 14:17
    #40024229
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убийство парковочного окна
Мои комменты выше можно игнорировать, я прочитал не то, что написано.

Я думал, там вызывается KiUserExceptionDispatcher, т.е. считал, что произошло какое-то исключение, и при его обработке выбрасывается второе (STATUS_FATAL_USER_CALLBACK_EXCEPTION).

А на самом деле там идёт вызов KiUserCallbackDispatch - это когда ядру нужно дёрнуть пользовательский код. Например, при рассылке сообщений.

Получается, что какой-то код (вероятно из этой .NET сборки?) кидает исключение (оконная процедура или какой-то фильтр/ловушка) и оно всплывает на самый верх. Поскольку там дальше должен быть возврат в ядро, необработанных исключений быть не может, вот и возбуждается STATUS_FATAL_USER_CALLBACK_EXCEPTION.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Убийство парковочного окна / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]