![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа не завершается
Savek © (2008-10-29 16:28:00)Программа клиент, которая подключается к серверу приложений (сокеты) не дает перезагрузить или выключить компьютер. Т.е. виндоус не может завершить её работу, хотя при нажатии на красн. крестик программа корректно завершает свою работу. Также программа завершает работу если послать ей сообщение
PostMessage(FindWindow(nil, 'BaseForm'), WM_Close, 0, 0);
из др. программы. Опытным путём установлено, что казус проявляются после того как импортируется интерфейс сервера
comNakl:=INumber3Disp(cnnSvrNakl.GetServer);
здесь INumber3Disp - interface(IDispatch) сервера
cnnSvrNakl - TSocketConnection
Ситуация непонятная. Помоготе прояснить
Leonid Troyanovsky (2008-10-31 16:40:00) [1]
> Savek (31.10.08 15:36) [23]
> Всё-таки нужно сымитировать запрос виндовс на закрытие программы,
> а то слишком геморно перезагружать комп постоянно...
Логоф спасет ОРД.
--
Regards, LVT.
Leonid Troyanovsky (2008-10-31 16:35:00) [2]
> Savek (29.10.08 16:28)
> после того как импортируется интерфейс сервера
Посмотри winsight32 or spy+ какие окна появляются после импорта.
Если, например, это (невидимое) окно верхнего уровня, то оно может
возвращать 0 на WM_QUERYENDSESSION.
Лечить можно установкой хука WH_CALLWNDPROC и закрытием
интерфейса на первом же WM_QUERYENDSESSION.
--
Regards, LVT.
Savek (2008-10-31 15:36:00) [3]
> Ну ты попробовал без колбэков ?
Попробовал. На WM_QUERYENDSESSION реакция не изменилась (onclosequery возникает onclose - нет, программа не завершает свою работу), а вот виндовс спокойно завершает работу программы!!! Попробовал колбэк в труе - такая же петрушка! Получается виндовс шлет программе другие сообщения? Интересно в какой момент решилась проблема, описанная в посте №1, а я об этом не знал, потому что проверял программу на воздействие WM_QUERYENDSESSION?
Всё-таки нужно сымитировать запрос виндовс на закрытие программы, а то слишком геморно перезагружать комп постоянно...
PS Сорри, сегодня больше не смогу появиться на форуме...
Rouse_ (2008-10-30 14:49:00) [4]Вообще однажды я воспроизводил такую ситуацию и проявлялся такой эффект в случае невызова DefWindowProc в каком-то второстепенном невидимом окошке...
Сергей М. (2008-10-30 12:36:00) [5]Ну ты попробовал без колбэков ?
Savek (2008-10-30 12:21:00) [6]
> Ты случаем (ну совершенно случайно) компоненты от печальноизвестных
> FastNet не используешь? Ну наподобие там NMUDP и т.п.?
нет
Rouse_ (2008-10-30 11:00:00) [7]Ты случаем (ну совершенно случайно) компоненты от печальноизвестных FastNet не используешь? Ну наподобие там NMUDP и т.п.?
Savek (2008-10-30 10:20:00) [8]сделал
procedure TBaseForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=true;
cnnSvrNakl.Close;
comNakl:=nil;
end;
прога по - прежнему не закрывается на сообщение $0011
> Ты реально используешь колбэки или от балды True поставил
> ?
Раньше использовал, но из-за сложности не смог внедрить этот механизм в проект должным образом и отказался от него. Сейчас поставлю в false.
Сергей М. (2008-10-30 10:05:00) [9]
> true
А собссно зачем ?
Ты реально используешь колбэки или от балды True поставил ?
Сергей М. (2008-10-30 10:03:00) [10]
> я незнаю как это правильно сделать
Прямо в обработчике OnCloseQuery
comNakl := nil
интерфейсный объект будет уничтожен при условии, что интерфейсная ссылка более нигде кроме как в переменной comNakl у тебя не фигурирует.
> Соединение закрывается в OnClose
Перенеси закрытие прямо в OnCloseQuery
Пробуй ..
Savek (2008-10-30 09:58:00) [11]
> А где и при каких условиях у тебя освобождается полученный
> интерфейсный объект
никак и нигде. по той причине, что я незнаю как это правильно сделать.
Соединение закрывается в OnClose и освобождается в OnDestroy
> И, кстати, чему у тебя равно SupportCallbacks
true
Savek (2008-10-30 09:54:00) [12]
> А где и при каких условиях у тебя освобождается полученный
> интерфейсный объект
никак и нигде. по той причине, что я незнаю как это правильно сделать.
Соединение закрывается в OnClose и освобождается в OnDestroy
Сергей М. (2008-10-30 09:35:00) [13]И, кстати, чему у тебя равно SupportCallbacks ?
Сергей М. (2008-10-30 09:18:00) [14]
> событие OnCloseQuery наступает, в нём ..CanClose:=true
Чудесно.
А где и при каких условиях у тебя освобождается полученный интерфейсный объект и закрывается сокетное соединение ?
Savek (2008-10-30 09:05:00) [15]
> Дополнительный (уточняющий) вопрос. Сидит ли иконка приложения,
> которое не дает выключить компьютер, в трее (вопрос не
> праздный)?
Раньше сидела, сейчас убрал все излишества.
> Попробуй начать отсюда:
спасибо, сейчас посмотрю
> Вот и начни с ЭТОГО.Как просветлишься по этому поводу -
> так сразу и милости просим
событие OnCloseQuery наступает, в нём по совету SmileCanClose:=true, событие OnClose не наступает.
Сергей М. (2008-10-29 19:59:00) [16]
> Savek (29.10.08 17:06) [5]
> не реагирует (по крайней мере нет видимой реакции)
Вот и начни с ЭТОГО.
Как просветлишься по этому поводу - так сразу и милости просим
Smile (2008-10-29 18:36:00) [17]Попробуй начать отсюда:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=57161
мне помогло:)
Ну, и рядом есть другие рекомендации по этому вопросу
Smile (2008-10-29 17:59:00) [18]Дополнительный (уточняющий) вопрос. Сидит ли иконка приложения, которое не дает выключить компьютер, в трее (вопрос не праздный)?
Savek (2008-10-29 17:32:00) [19]
> С полгода назад столкнулся с похожей проблемой. Решение
> нашел на Королевстве. Деталей сейчас уже, к сожалению, не
> помню.Для начала попробуй в FormCloseQuery добавитьCanClose:
> =True;
не помогло (
> не реагирует (по крайней мере нет видимой реакции)
точнее реакция есть: если посмотреть лог Application.OnMessage сообщение приходит ($0011), но видимо не обрабатывается
Smile (2008-10-29 17:25:00) [20]С полгода назад столкнулся с похожей проблемой. Решение нашел на Королевстве. Деталей сейчас уже, к сожалению, не помню.
Для начала попробуй вFormCloseQueryдобавить
CanClose:=True;