Исключение на не известную функцию в С++

115
03 сентября 2019, 03:50

Подскажите, совсем новичку. Нужно сделать исключение вызову функции, которое не поддерживается операционной системой. Создаю консольное приложение. Использую вызов SetCurrentConsoleFontEx() для установки параметров окна. Нужно, что-бы функция игнорировалась, когда приложение запускается на WinXP, так как XP ни чего не знает об этой функции. Пробую так:

    int main(int argc, char *argv[])
{
    const DWORD encodedVersion = ::GetVersion();
    const unsigned majorVersion = unsigned(LOBYTE(LOWORD(encodedVersion)));
    if (majorVersion > 5)  // majorVersion возвращает 5
    {
    HANDLE out_handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFOEX cfie;
    ZeroMemory(&cfie, sizeof(cfie));
    cfie.cbSize = sizeof(cfie);
    cfie.dwFontSize.Y = 14;  
    lstrcpyW(cfie.FaceName, L"Lucida Console");
    SetCurrentConsoleFontEx(out_handle, false, &cfie); // Здесь программа падает в исключение.
    };
    return(0);
}

второй вариант, пробую поставить исключение наличия самой функции:

    int main(int argc, char *argv[])
{
    HINSTANCE le_module = LoadLibrary(L"kernel32.dll");
    LPCSTR func_name = "SetCurrentConsoleFontEx"; 
    FARPROC adresse_la_func = GetProcAddress(le_module, func_name);
    try
    {
        if(adresse_la_func == 0)  // здесь adresse_la_func возвращает 0
            throw - 1;
        HANDLE out_handle = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_FONT_INFOEX cfie;
        ZeroMemory(&cfie, sizeof(cfie));
        cfie.cbSize = sizeof(cfie);
        cfie.dwFontSize.Y = 14; 
        lstrcpyW(cfie.FaceName, L"Lucida Console");
        SetCurrentConsoleFontEx(out_handle, false, &cfie); // Здесь программа падает в исключение.
    }
    catch (int)
    {
        cout << " output" << endl;
    }
    return(0);
}

Подскажите, как сделать так, что бы WinXP игнорировал этот вызов? Работаю в среде VS2015. Оба кода прекрасно работают в Win после XP.

Answer 1

Нужно использовать второй вариант, только он у вас с ошибкой, оттого и падает. Еще исключение там совершенно ни к чему, вы им по сути имитируете обычный if. Вот исправленный код, комментариями со звездочками отмечены измененные места.

int main(int argc, char *argv[]) {
    HINSTANCE le_module = LoadLibrary(L"kernel32.dll");
    LPCSTR func_name = "SetCurrentConsoleFontEx"; 
    BOOL (WINAPI *setCurrentConsoleFontEx)(HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); //************
    (FARPROC&)setCurrentConsoleFontEx = GetProcAddress(le_module, func_name); //***********
    if(setCurrentConsoleFontEx != NULL) { //*************
        HANDLE out_handle = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_FONT_INFOEX cfie;
        ZeroMemory(&cfie, sizeof(cfie));
        cfie.cbSize = sizeof(cfie);
        cfie.dwFontSize.Y = 14; 
        lstrcpyW(cfie.FaceName, L"Lucida Console");
        setCurrentConsoleFontEx(out_handle, false, &cfie); //*************
    }
    return 0;
}
READ ALSO
OpenMP. Нетривиальный случай

OpenMP. Нетривиальный случай

Аналог реальной программыКак переместить создание потоков (#pragma omp parallel) в main_, но оставить funcSerial однопоточным (последовательным)? funcSerial я распараллеливать...

86
Запуск сервера на C++ Visual Studio [закрыт]

Запуск сервера на C++ Visual Studio [закрыт]

Запускаю локальный отладчик Windows(x86)

124
std::move для объекта, возвращенного функцией

std::move для объекта, возвращенного функцией

Имеется один файл maincpp, в котором определены две глобальные функции getSomeResultFromSomeFunc(), processResult() и функция main():

99
Доступ к файлу proc//mem

Доступ к файлу proc//mem

При прохождении одного из онлайн тестов наткнулся на сложный вопросВопрос формулируется примерно так:

119