powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Убийство парковочного окна
21 сообщений из 21, страница 1 из 1
Убийство парковочного окна
    #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
Убийство парковочного окна
    #40023376
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_увствую, что проблема именно из-за отсылки сообщения из секции финализации

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

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

Про Wait думать надо, только если
дело в отложке (скажем, ждать ответа).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #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
Убийство парковочного окна
    #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
Убийство парковочного окна
    #40023656
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Большой промежуток тоже?
Да. Именно его и смотрел. 5 секунд ставил
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #40023658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Я привел ее текст в первом посте.

Добавь в неё try-except с протоколированием пойманного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #40023659
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
3. Vcl.AxCtrls.ParkingWindowProc - обрабатывает WM_CLOSE
Тут я бы не был так уверен
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #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
Убийство парковочного окна
    #40023941
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так на каком сообщении валится-то?
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #40023979
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Ну так на каком сообщении валится-то?
После выхода из обработки WM_ACTIVATEAPP.

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

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

?

У тебя трейсер исключений подключен? Можешь посмотреть, что за исключение-то? Или можно точку останова на KiUserCallbackDispatcher поставить.
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #40024069
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Т.е. получается
Да
GunSmoker
У тебя трейсер исключений подключен?
Это из Eureka? У меня ее нет
GunSmoker
Или можно точку останова на KiUserCallbackDispatcher поставить.
Завтра сделаю
...
Рейтинг: 0 / 0
Убийство парковочного окна
    #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
Убийство парковочного окна
    #40024205
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Добавь в неё try-except с протоколированием пойманного.
Не заметил этого сообщения.

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

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

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

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

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

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


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