Обнаружена ошибка. Приложение будет закрыто.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Обнаружена ошибка. Приложение будет закрыто.

Сообщение Source » 17.10.2007 (Ср) 3:26

При выходе через PopUp - меню на иконке в трэе приложение завершается некорректно - Обнаружена ошибка. Приложение будет закрыто. При нажатии на кнопку закрытия окна выходит нормально. В чём м.б. причина? Стоит хук на перехват сообщений главному окну. Если установить флаг на обход выполнения кода в хуке при выходе из проги - всё равно вылет :(

Код: Выделить всё
Private Sub mnuTray_Exit_Click()
    Unload frmMain
End Sub

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)   

End Function

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 6:04

даже если не вызывать меню, выйти по правому клику на иконке (поставил End прямо в обработчике сообщений после WM_RBUTTONDOWN), то будет та же ошибка.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2007 (Ср) 8:02

Нефиг End ставить. Особенно под сабклассингом.
Lasciate ogni speranza, voi ch'entrate.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 9:33

Unload тоже не работает. А ведь раньше работало, а теперь не хочет.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2007 (Ср) 9:56

Unload работает. Только вначале сними сабклассинг.
Lasciate ogni speranza, voi ch'entrate.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 20:52

по моему, сама процедура Unload вызывается из под процедуры обработки сообщений, когда Винда шлёт сообщение окну о выходе. Так почему бы ей не работать нормально из-под моей процедуры перехвата сообщений? Тем более, что я точно помню, что я не раз выходил нормально из под меню иконки трэя, но теперь, когда программа разрослась, что-то происходит не то при выходе. Процедура перехвата сообщений вроде не менялась. Надо поднять старые архивы и посмотреть, в чём же дело? Придётся конечно, поковыряться, но вешать таймер ожидания снятия хука по моему не совсем красивый выход :(

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 18.10.2007 (Чт) 8:52

установил флаг выхода в mnuTray_Exit_Click() и в таймере по нему выхожу. Всё отлично!

А если слать сообщение о закрытии окна, почему-то всё равно выходит с ошибкой! Вывод меню - операция блокирующая, сначала, вызывая меню в процедуре хука обработки сообщений в событии mnuTray_Exit_Click(), написал SendMessage Me.hwnd, WM_CLOSE,0,0. По идее после выполнения SendMessage должна была завершиться mnuTray_Exit_Click(), затем процедура хука, где было вызвано меню. Затем по сообщению WM_CLOSE должна сработать проца Unload, где снимается хук. Но, т.к. прога завешилась с ошибкой, Unload было вызвано из обработчика сообщений хука. Как такое могло произойти? Наверное, в этом замешана CallWindowProc, но каким образом? Т.е. каким образом происходит вызов процедур при отправке WM_CLOSE?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.10.2007 (Чт) 12:19

Source
Возьми OllyDbg. Необязательно разбираться в тонокстях отладки. Запусти и проведи все необходимые для воссоздания ошибки действия. А затем посмотри, что будет написано в строке состояния Olly, при возникновении исключения.

Я предполагаю, что исключения выбрасывается из-за того, что происходит попытка выполнять невыполнимый код.

Т.е. секция кода уже была unmapped, а класс окна ещё ссылается на этот участко памяти.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 18.10.2007 (Чт) 14:54

[Off]
имхо один раз самому надо определить, что не так и почему. иначе постоянно будешь наступать на одни грабли.
[/Off]
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 18.10.2007 (Чт) 17:24

не знаю, дойдут ли руки у меня до дебаггера, но я думал, что ошибка происходит из-за вызова UnHookMsgWnd в WindowProc косвенным образом. Это я и старался исключить. В одном случае у меня это получилось, в другом нет.

Код: Выделить всё
'снять хук
Public Sub UnHookMsgWnd()
    Dim Temp As Long
    Temp = SetWindowLong(MyHWND, GWL_WNDPROC, lpPrevWndProc)
End Sub


Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)   

UnHookMsgWnd

End Function

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 19.10.2007 (Пт) 19:03

всё таки это был виновен не UnHookMsgWnd, а End!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 95

    TopList