-
Есть приложение. Есть форма в DLL. Потоков нет (важно!).
Запускаю приложение, открываю форму, делаю в ней что угодно, закрываю. Все в порядке. Открываю форму второй раз, форма открывается, кликаю в Edit и получаю "System Error. Code: 1400. Invalid window handle". Ошибка возникает внутри VCL при обработке сообщения WM_FOCUS.
Код приводить смысла мало, его много и никто все равно не будет разбираться в деталях. Но хотелось бы послушать версии, почему такое может происходить.
Все ответы, которые я нашел в интернете, связывают проблему с несинхронизированной работой с VCL из других потоков. Но у меня потоков нет. Также очень странно, что при первом открытии формы никаких проблем нет.
-
Есть такая штука как отладка/дебаг/логи =) Какой конкретно метод или что там вызывает ошибку? IsWindow()? А VCL и в exe и в dll? Их смешивать по идее незя, если что.
-
Закрываю именно форму? и закрываю или прячу? Вне отладчика нормально, приложение не падает?
Была похожая ситуация - накосячил - освобождались строки по левым адресам.
-
> DQ (14.10.14 02:40) [1] > Какой конкретно метод или что там вызывает ошибку? IsWindow()?
:7577812f KERNELBASE.RaiseException + 0x54
System.SysUtils.RaiseLastOSError(???,???)
System.SysUtils.RaiseLastOSError
Vcl.Controls.TWinControl.CreateWnd
Vcl.Forms.TScrollingWinControl.CreateWnd
Vcl.Forms.TCustomForm.CreateWnd
Vcl.Controls.TWinControl.CreateHandle
Vcl.Controls.TWinControl.HandleNeeded
Vcl.Controls.TWinControl.GetHandle
Vcl.Forms.TCustomForm.SetFocusedControl($391D670)
Vcl.Controls.TWinControl.WndProc((7, 4195510, 0, 0, 1206, 64, (), 0, 0, (), 0, 0, ()))
Vcl.Controls.TWinControl.MainWndProc(???)
System.Classes.StdWndProc(3343424,7,4195510,0) > А VCL и в exe и в dll?
В DLL. > NoUser © (14.10.14 03:01) [2] > > Закрываю именно форму? и закрываю или прячу?
Закрываю. Т.е. форма каждый раз заново создается. Этот факт меня особенно напрягает. Ведь логики никакой не видно. Воспроизводится очень стабильно. Ровно на второй раз. 1. Открыл форму 2. Поставил фокус в TEdit 3. Закрыл форму 4. Открыл форму 5. Поставил фокус в TEdit и упал > Вне отладчика нормально, приложение не падает?
Так же падает. Вообще никакой разницы.
-
Победил. Шаманство сплошное. Не люблю решения, которые я сам не понимаю.
В общем, эта проблемная дочерняя форма закрывается не сама по себе, а при закрытии родительской формы (автоматически). Я добавил Application.ProcessMessages в OnClose родительской формы и все заработало как нужно. Вот такая вот фигня. Надеюсь, это действительно решает проблему. По крайней мере ошибки я больше не вижу.
Не спрашивайте как я догадался, просто заметил некие закономерности в поведении.
-
Дело похоже в порядке уничтожения форм. ProcessMessages позволяет дочерней форме обработать CM_RELEASE и умереть раньше, чем родительская форма будет закрыта. Нужно попробовать закрывать ее не через Close (там Action=caFree), а через Free. Чтоб без гадких ProcessMessages все обошлось.
-
-
Да, поменял Close на Free, теперь работает и без ProcessMessages. Дело было явно в порядке уничтожения форм.
Оставляю тут этот ответ для гугла и будущих поколений. При ошибке "Invalid window handle" дело может быть не только в потоках :)
> NoUser © (14.10.14 12:02) [6]
Ага. Посмотрю.
|