Вызываю ShowWindow для чужого окна с разными параметрами SW_RESTORE, SW_MINIMIZE, SW_MAXIMIZE и др. Действие выполняется корректно ВСЕГДА, но в некоторых случаях (точно не понимаю, при каких условиях) GetLastError() после вызова ShowWindow возвращает ERROR_ALREADY_EXISTS (183), хотя требуемое действие было выполнено на ура.
Здравствуйте, pavel2005, Вы писали:
P>Вызываю ShowWindow для чужого окна с разными параметрами SW_RESTORE, SW_MINIMIZE, SW_MAXIMIZE и др. Действие выполняется корректно ВСЕГДА, но в некоторых случаях (точно не понимаю, при каких условиях) GetLastError() после вызова ShowWindow возвращает ERROR_ALREADY_EXISTS (183), хотя требуемое действие было выполнено на ура.
P>Что за чертовщина? На что ругается WinAPI???
Кто вам сказал что ShowWindow устанавливает last error? Судя по документации, она его не трогает. Следовательно там может быть что угодно, оставшееся после выполнения какой-лиюо другой фукнкции (вызванной например той же ShowWindow) в этом же потоке.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Кто вам сказал что ShowWindow устанавливает last error? Судя по документации, она его не трогает. Следовательно там может быть что угодно, оставшееся после выполнения какой-лиюо другой фукнкции (вызванной например той же ShowWindow) в этом же потоке.
Верно. Просто я пишу оболочку WinAPI под свои нужды, и мне необходимо ловить некоторые ошибки, например, если ShowWindow передали некорректный hwnd. Вот почему я вызываю GetLastError. Придется просто игнорировать ошибку 183 после ShowWindow.
Здравствуйте, pavel2005, Вы писали:
P>Верно. Просто я пишу оболочку WinAPI под свои нужды, и мне необходимо ловить некоторые ошибки, например, если ShowWindow передали некорректный hwnd. Вот почему я вызываю GetLastError. Придется просто игнорировать ошибку 183 после ShowWindow.
_Вообще_ некорректно проверять значение, возвращаемое GetLastError() после вызова ShowWindow. Оно просто не имеет значения.
>_Вообще_ некорректно проверять значение, возвращаемое GetLastError() после вызова ShowWindow. Оно просто не имеет значения.
>Насчет некорректного hwnd — смотри IsWindow
Насчёт IsWindow в первоисточнике написано, что
A thread should not use IsWindow for a window that it did not create because the window could be destroyed after this function was called. Further, because window handles are recycled the handle could even point to a different window.
Судя по первоначальному посту hwnd чужой, поэтому на IsWindow полагаться нельзя.
"pavel2005" <51808@users.rsdn.ru> wrote in message news:1703658@news.rsdn.ru... > Верно. Просто я пишу оболочку WinAPI под свои нужды, и мне необходимо ловить некоторые ошибки, например, если ShowWindow передали некорректный hwnd. Вот почему я вызываю GetLastError. Придется просто игнорировать ошибку 183 после ShowWindow.
Или так:
SetLastError(0);
YourApiFunctionCall;
GetLastError — если не 0, то что-то не получилось.
Здравствуйте, wellwell, Вы писали:
W>Или так: W>SetLastError(0); W>YourApiFunctionCall; W>GetLastError — если не 0, то что-то не получилось.
Непонятно что это дает. YourApiFunctionCall может вызвать еще пятьдесят функций OtherApiFunctionCall и одна из них установит last error. Причем это не обязательно будет обозначать, что вызов YourApiFunctionCall прошел неудачно.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
"ekamaloff" <48275@users.rsdn.ru> wrote in message news:1703859@news.rsdn.ru... > Непонятно что это дает. YourApiFunctionCall может вызвать еще пятьдесят функций OtherApiFunctionCall и одна из них установит last error. Причем это не обязательно будет обозначать, что вызов YourApiFunctionCall прошел неудачно.
А они что, еще и внутри себя last error меняют? Вот это для меня новость, честно говоря. То есть, предположим мы вызвали API GetUserName, которая (опять же предположим) внутри себя вызвала HeapAlloc, а после того как он обломался — GlobalAlloc который был успешен. Значит ли это, что GetUserName вернет True и одновременно изменит GetLastError?
Здравствуйте, wellwell, Вы писали:
W>А они что, еще и внутри себя last error меняют? Вот это для меня новость, честно говоря.
А почему бы и нет? Что собственно говоря может помешать им это сделать?
A>То есть, предположим мы вызвали API GetUserName, которая (опять же предположим) внутри себя вызвала HeapAlloc, а после того как он обломался — GlobalAlloc который был успешен. Значит ли это, что GetUserName вернет True и одновременно изменит GetLastError?
Именно. Пример как раз в тему. GetUserName не говорит нам, что после ее вызова last error будет установлен, а значит проверять его мы не можем.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde