Подскажите, совсем новичку. Нужно сделать исключение вызову функции, которое не поддерживается операционной системой. Создаю консольное приложение. Использую вызов 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.
Нужно использовать второй вариант, только он у вас с ошибкой, оттого и падает. Еще исключение там совершенно ни к чему, вы им по сути имитируете обычный 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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Аналог реальной программыКак переместить создание потоков (#pragma omp parallel) в main_, но оставить funcSerial однопоточным (последовательным)? funcSerial я распараллеливать...
Имеется один файл maincpp, в котором определены две глобальные функции getSomeResultFromSomeFunc(), processResult() и функция main():
При прохождении одного из онлайн тестов наткнулся на сложный вопросВопрос формулируется примерно так: