Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

A call to an OS function failed

302
18 января 2007 года
Sagittarius
648 / / 12.04.2003
При закрытии приложения вылетает ошибка "A call to an OS function failed".
Причем:
- вылетает даже, если просто запустить приложения, и сразу же закрыть.
- дебагер не помогает, ошибка вылетает уже после того, как отработает основной модуль.
- В WinXP SP1, WinXP SP2, 2003 работает нормально. Вылетает на Win2000 SP 4.

По какой причине может вылетать ошибка? Как узнать, что за функция ОС вызывается?
261
18 января 2007 года
ahilles
1.5K / / 03.11.2005
это наверное из за того что твоя прога пытается вызвать системный вызов через sysenter при этом пытаясь обойти Native API, в win2000 системный вызов происходит через int 2e, но это всего лишь догадка, потому что я даже не представляю что твоя прога делает.........

win2000 сейчас уже постепенно уходит в историю
её щас устанавливают только на старые компьютеры, поэтому можешь не париться.......
303
19 января 2007 года
makbeth
1.0K / / 25.11.2004
В голову приходит только ошибка при работе с uxtheme.dll (судя по OS, в которых прога нормально работает. Но это опять же предположение...
302
19 января 2007 года
Sagittarius
648 / / 12.04.2003
2ahilles
Дело в том, что ошибка вылетает после закрытия. Можно спокойно отработать сеанс без ошибок, а когда попытаешься закрыть, она вылетает.
Пытался ковыряться в асемблерном коде (Ctrl+Alt+C), предположительно, ошибка вылетает в процедуре RtlUnwind в ntdll.dll (стоит метка ntdll.RtlUnwind).

2makbeth
Да, я уже столкивался с проблемами с uxtheme.dll на вин2000 и решил эту проблему.

P.S. Программа является частью корпоративной системы, активно работает с БД.
P.S.S. К сожалению, заставить перейти несколько заводов и предприятий на WinXP я не могу. :(
10
19 января 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: Sagittarius

предположительно, ошибка вылетает в процедуре RtlUnwind в ntdll.dll (стоит метка ntdll.RtlUnwind).


Вряд ли, это раскрутчик стека при возникновении исключения.

А вообще, сообщение "A call to an OS function failed" вызывается из SysUtils, когда Win32Check или RaiseLastOSError не находит сообщения об ошибке в своём списке и/или не может получить его от системы через FormatMessage.

302
19 января 2007 года
Sagittarius
648 / / 12.04.2003
Цитата: Freeman
Вряд ли, это раскрутчик стека при возникновении исключения.


:) Буду знать.

Ошибку я локализовал и исправил. Точнее ошибки:
1. Ошибка вылетает, если используется FastReport 4.1. При откате на FasteReport 3.24 все нормально. Справедливости ради, стоит сказать, что компилирую с пакетами исполнения, может без пакетов с FastReport 4 будет нормально.
2. Вторая ошибка, вылетала в секций finalization одного из модулей. В initialization создавалась форма, а в finalization она удалялась. Но, что странно, у меня есть еще один модуль, где таким же образом создается и удаляется форма и он работает без ошибок.

10
19 января 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: Sagittarius
:) Буду знать.


Микрочлены мало где её упоминают, но она используется всеми компиляторами (или большинством).

Цитата: Sagittarius
При откате на FasteReport 3.24 все нормально.


Не страна, а сплошная откатная. (c) Антимульт.

Цитата: Sagittarius
2. Вторая ошибка, вылетала в секций finalization одного из модулей. В initialization создавалась форма, а в finalization она удалялась.


Возможно, в finalization происходит повторное освобождение формы, удалённой до этого предком, например, Application-ом. Общее правило - формы (и прочие компоненты), создаваемые в глобальных переменных, должны:

  • принадлежать Application (или какому-то другому предку) и не иметь явного кода освобождения
  • не принадлежать никому (TMyForm.Create(nil)) и иметь код явного освобождения
302
19 января 2007 года
Sagittarius
648 / / 12.04.2003
Цитата: Freeman
не принадлежать никому (TMyForm.Create(nil)) и иметь код явного освобождения


У меня такой вариант.

10
19 января 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: Sagittarius
У меня такой вариант.


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

261
19 января 2007 года
ahilles
1.5K / / 03.11.2005
короче что то забыл уничтожить или что то уничтожил раньше положенного, например какие то хендлы забыл закрыть или не в том порядке, XP менее чувствительна к такой канители
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог