А вот кому свежей шизы от микрософта?
May. 5th, 2009 12:58 amНашел себе новое фетишистское развлечение - гоняю все свои приложения под Application Verifier. В принципе, уже пару багов у себя и не у себя нашел.
Но на самый трэшак наткнулся только что. GUIшная прога при запуске из фара - работает нормально, а если запускать с десктопа(и вообще из эксплорера) - падает с уведомлением INVALID HANDLE от Application Verifier.
Сеанс отладки показал, что функция GetStdHandle(STR_OUTPUT_HANLDE) в случае запуска проги без консоли из фара - возвращает 0, как и положено, и у меня срабатывает проверка на неправильный хендл.
А вот если запускать прогу из Explorer - возвращается магическое значение 0x00010001, никакой константе не соответствующее, и вызывающее при операции с ним это уведомление от verifier.
Гугл подсказал только, что не у одного меня такие проблемы, решение - чистый костыль, т.е. просто сравнение с этим значением. Пришлось так и сделать, пометив в коде комментарием к константе что значение не просто так, а принесено жабами и червями.
Но на самый трэшак наткнулся только что. GUIшная прога при запуске из фара - работает нормально, а если запускать с десктопа(и вообще из эксплорера) - падает с уведомлением INVALID HANDLE от Application Verifier.
Сеанс отладки показал, что функция GetStdHandle(STR_OUTPUT_HANLDE) в случае запуска проги без консоли из фара - возвращает 0, как и положено, и у меня срабатывает проверка на неправильный хендл.
А вот если запускать прогу из Explorer - возвращается магическое значение 0x00010001, никакой константе не соответствующее, и вызывающее при операции с ним это уведомление от verifier.
Гугл подсказал только, что не у одного меня такие проблемы, решение - чистый костыль, т.е. просто сравнение с этим значением. Пришлось так и сделать, пометив в коде комментарием к константе что значение не просто так, а принесено жабами и червями.
no subject
Date: 2009-05-05 04:36 am (UTC)И бага уйдёт, и время в рантайме тратится не будет. :)
no subject
Date: 2009-05-05 05:27 am (UTC)no subject
Date: 2009-05-05 05:59 am (UTC)Хотя можно ещё флаги хост приложения добыть и разобрать. Ну и в рантайме вполне возможно такой флажек уже есть.
Хотя это от компилера зависит.
Для багланда я вроде натыкался.
no subject
Date: 2009-05-05 09:36 am (UTC)Только GUI-приложение вполне может открыть консоль и по его флажкам ты это не поймёшь.
no subject
Date: 2009-05-05 05:35 am (UTC)no subject
Date: 2011-05-18 04:47 pm (UTC)HANDLE WINAPI GetStdHandle( DWORD nStdHandle ) { PPEB Peb; HANDLE rv; Peb = NtCurrentPeb(); switch( nStdHandle ) { case STD_INPUT_HANDLE: rv = Peb->ProcessParameters->StandardInput; break; case STD_OUTPUT_HANDLE: rv = Peb->ProcessParameters->StandardOutput; break; case STD_ERROR_HANDLE: rv = Peb->ProcessParameters->StandardError; break; default: rv = INVALID_HANDLE_VALUE; break; } if ( rv == INVALID_HANDLE_VALUE ) { BaseSetLastNTError(STATUS_INVALID_HANDLE); } return rv; }В 7-ке эту пакость исправили (добавили проверку на наличие консоли), но в документации по GetStdHandle(), конечно же, "null said" насчет проблемы в XP.
По всему получается, что для работоспособности "везде" перед вызовом GetStdHandle() надо самостоятельно проверять наличие консоли. Я делаю так:
bool IsConsoleExists() { bool res = false; if( FILE* fp = fopen("CON", "w") ) { res = true; fclose(fp); } return res; }Кто знает прямей способ, буду рад узнать,
Илья Муравьев (http://www.bombono.org)