Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/65: Рейтинг темы: голосов - 65, средняя оценка - 4.57
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210

EOSError 1400 “Недопустимый дескриптор окна”

27.01.2014, 14:06. Показов 13495. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа (назовём её My1.exe ) периодически обращается из потока к COM-порту. На компьютере есть и другие программы, которые так же могут обращаться к порту или пользователь может указать номер отсутствующего порта. Короче, при неудаче выдаётся сообщение, что не удалось опросить порт и программа продолжает заниматься “другими делами”. Через определённый промежуток времени опрос порта повторяется и, если он свободен, то всё работает согласно алгоритму.
Столкнулся с проблемой. Если My1.exe обращалась хотя бы один раз к занятому или отсутствующему в системе порту, то при закрытии программы возникает ошибка:
“Project My1.exe raised evception class EOSError with message “System Error Code: 1400. Недопустимый дескриптор окна.”
И выдаётся сообщение:
“Abnormal program termination”.
Я понимаю, что с точки зрения ОС некорректно обращаться к занятому ресурсу, но тем не менее задачу надо решать… Запретить другим программам обращаться к порту я не имею права.
На старых версиях (С++Builder-6) такой проблемы не было.
Вот отрывок кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//----------------------------------------------------
LPCTSTR NamePort; // Имя порта.
switch(Form1->INIZ.COM) // Имя порта.
{
    case 0: NamePort=(LPCTSTR)L"COM1";
    break;
    case 1: NamePort=(LPCTSTR)L"COM2";
    break;
// ...
}
hCom=CreateFile(NamePort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);  
if (hCom == INVALID_HANDLE_VALUE) // Если ошибка при открытии порта.
{
    Form1->StaticText1->Visible=true; // Сообщение о недоступности в н.в. СОМ-порта.
}
else
{
……… //  Инициализация DCB и т.д.
//----------------------------------------------------
Закрытие неоткрытого порта (CloseHandle(hCom);) ничего не меняет. Как можно избавиться от этого сообщения?

Добавлено через 1 час 4 минуты
Обнаружил интересную особенность.
Если функцию открытия порта (CreateFile) вызываю вне потока, то ошибка не возникает.
Почему возникает ошибка, если в потоке осуществляется попытка к доступу занятому ресурсу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2014, 14:06
Ответы с готовыми решениями:

Недопустимый дескриптор окна. (Обмен сообщениями: TCP)
Доброго времени суток. Есть программа, которая производит обмен сообщениями по сети между несколькими компьютерами (использую TCP...

EOSError 1400 "Недопустимый дескриптор окна"
Доброго времени суток. После того как перенес некоторый код в поток при завершении программы стала вылетать ошибка EOSError 1400...

'System Error. Code: 1400. Недопустимый дескриптор окна'
Пишу многопоточную программу, а при ее закрытии после работы потоков выдает эту ошибку, из-за чего не могу понять, в интернете тоже...

2
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
16.05.2014, 18:51
Аналогичная проблема. Создаю приложение, к которому подключаю DLL с формой. Задача в том, что приложение загоняет в DLL некие исходные данные, которые в DLL хранятся и обрабатываются. В DLL должна быть форма, которая должна вызываться из самой DLL внутри функции, которая будет вызываться из приложения. На этой форме могут редактироваться данные, которые приложение передало в DLL. Изменение этих данных будет влиять на значения других функций, хранящихся в DLL и вызываемых приложением.

Форму в DLL вставить получилось. Всё стандартно:
C++
1
2
3
4
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner) {}
ну и в хэдэре набор стандартных инструкций. В приложении я инклюдю DLL и вызываю функцию Test2() на каком-нить баттоне. Если функция Test2() в DLL выглядит так:
C++
1
2
3
extern "C" __declspec(dllexport) void __stdcall Test2()
{Form2 -> Show();
}
То при нажатии баттона из приложения поймаем ошибку:

---------------------------
Debugger Exception Notification
---------------------------
Project 1.exe raised exception class EAccessViolation with message 'Access violation at address 00342D82 in module '1.DLL'. Read of address 000002EC'. Process stopped. Use Step or Run to continue.

Выкрутился так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//---------------------------------------------------------------------------
extern "C"
{void __declspec(dllexport) __stdcall show(TApplication*);
}
//---------------------------------------------------------------------------
void __declspec(dllexport) __stdcall show(TApplication *App)
{Form2 = new TForm2(App);
 Form2 -> Show();
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall Test2()
{show(Application);
}
//---------------------------------------------------------------------------
Заработало! Но! Приложение перестало быть активным и пока форма не закроется, на него не перейти и новые данные в DLL не отправить. А это в моём случае важно, т.к. данные поступают в реальном времени и их всё время надо отправлять в DLL. Выкручиваюсь потоком:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int kuku, end;
HANDLE ht;
unsigned tid;
//---------------------------------------------------------------------------
unsigned __stdcall thread_fun (void *kuku)
{show(Application);
 return 0;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall Test2()
{unsigned long _beginthreadex(void *security,
                              unsigned stack_size,
                              unsigned __stdcall (*thread_fun)(void *),
                              void *argument,
                              unsigned init_state,
                              unsigned *tid);
 
 ht = (HANDLE)_beginthreadex(NULL, 0, thread_fun, (void *)kuku, 0, &tid);
}
//---------------------------------------------------------------------------
Компилится без ошибок, но форма исчезает едва успев появиться, и вылазит новая ошибка, от которой не помогает избавиться и следующий шаг:
C++
1
2
3
4
void __declspec(dllexport) __stdcall show(TApplication *App)
{Form2 = new TForm2(App);
 Form2 -> ShowModal();     // вместо Form2 -> Show();
}
Окно продолжает висеть, не исчезает, новые данные в приложение поступают, отправляются в DLL, заменяются на её форме и всё просто замечательно, если бы при закрытии приложения (не формы, с закрытием формы всё нормально) не выскакивала указанная ошибка:

---------------------------
Debugger Exception Notification
---------------------------
Project 1.exe raised exception class EOSError with message 'System Error. Code: 1400.
Недопустимый дескриптор окна'. Process stopped. Use Step or Run to continue.
---------------------------

Уже и дескрипторы перезакрывал, и терминэйтил - ниччё не помогает... Если решения не найду - буду через БД реализовывать, но не хотелось бы...
1
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
17.05.2014, 23:48  [ТС]
Проблема с портом удалось решить: функции открытия порта и обмена перенёс в основную форму Unit1.cpp (до этого они были в Unit9.cpp). Ошибка при закрытии программы перестала возникать.
Заработало всё нормально, но причину так и не понял...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2014, 23:48
Помогаю со студенческими работами здесь

System Error. Code 1400. Недопустимый дескриптор окна
Вобщем такая проблема есть БД акссес и программа все рабоет но при закрытии программы выдает ошибку System Error. Code 1400. Недопустимый...

Недопустимый дескриптор окна
Добрый вечер уважаемые форумчане. Вопрос конечно изъезженный но все таки для себя решения я не смог найти в гугле и на форумах. Поэтому...

Недопустимый дескриптор окна =)
Все пашет вот только... Обьясняю))) В общем Основное Приложение вызывает SendPPMsg из DLL и все замечательно, если не попытаться закрыть ОП...

Ошибка Exception EOSError in module .... System error. Code: 1400. Invalid window handle.
Доброе время суток! Я использовал поток в приложении CreateThread().. Примерно такая струкура приложения получилась: interface uses ...

Нужно получить дескриптор окна имея дескриптор контрола
Нужно получить дескриптор окна имея дескриптор контрола, подскажите как


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru