metaclass: (Default)
[personal profile] metaclass
Нашел себе новое фетишистское развлечение - гоняю все свои приложения под Application Verifier. В принципе, уже пару багов у себя и не у себя нашел.

Но на самый трэшак наткнулся только что. GUIшная прога при запуске из фара - работает нормально, а если запускать с десктопа(и вообще из эксплорера) - падает с уведомлением INVALID HANDLE от Application Verifier.

Сеанс отладки показал, что функция GetStdHandle(STR_OUTPUT_HANLDE) в случае запуска проги без консоли из фара - возвращает 0, как и положено, и у меня срабатывает проверка на неправильный хендл.
А вот если запускать прогу из Explorer - возвращается магическое значение 0x00010001, никакой константе не соответствующее, и вызывающее при операции с ним это уведомление от verifier.
Гугл подсказал только, что не у одного меня такие проблемы, решение - чистый костыль, т.е. просто сравнение с этим значением. Пришлось так и сделать, пометив в коде комментарием к константе что значение не просто так, а принесено жабами и червями.

Date: 2009-05-05 04:36 am (UTC)
From: [identity profile] tonal.myopenid.com (from livejournal.com)
По моему проще нужно быть - обернуть код работы с stdout-ом ифдефами, которые убирают его при сборке под GUI.
И бага уйдёт, и время в рантайме тратится не будет. :)

Date: 2009-05-05 05:27 am (UTC)
From: [identity profile] metaclass.livejournal.com
Не, в том месте ifdef не положено. Либа должна одинаково работать как в гуи таки и в консоли.

Date: 2009-05-05 05:59 am (UTC)
From: [identity profile] tonal.myopenid.com (from livejournal.com)
Ежели либа - тады ой.
Хотя можно ещё флаги хост приложения добыть и разобрать. Ну и в рантайме вполне возможно такой флажек уже есть.
Хотя это от компилера зависит.
Для багланда я вроде натыкался.

Date: 2009-05-05 09:36 am (UTC)
From: [identity profile] blacklion.livejournal.com
Хотя можно ещё флаги хост приложения добыть и разобрать
Только GUI-приложение вполне может открыть консоль и по его флажкам ты это не поймёшь.

Date: 2009-05-05 05:35 am (UTC)
From: [identity profile] komarov.livejournal.com
то есть пользователь потом должен будет кагбе разные бинарники запускать из консоли и из проводника?

Date: 2011-05-18 04:47 pm (UTC)
From: [identity profile] Илья Муравьев (from livejournal.com)
Тоже наткнулся на проблему GetStdHandle(STR_OUTPUT_HANLDE) == 0x00010001, стал разбираться... Оказалось, что просто вызвать GetStdHandle(std_id) - неправильно, потому что для Win <= XP просто возвратится NtCurrentPeb()->ProcessParameters->Standard[Input|Output|Error]; и что для не имеющего консоль приложения это означает возврат мусора (ну, может, не совсем мусора,- значения хэндлов в винде наследуются от родительского процесса). Вот реализация функции из утекших в сеть исходников Win2000:
 
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)



Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2025 07:53 am
Powered by Dreamwidth Studios