2015-12-05 7 views
2

У меня есть приложение для Windows, которое должно работать в XP и выше. Но Windows API для XP обычно отличается от Vista и выше. Какие условные флаги компиляции я могу проверить, чтобы определить, какие ОС Windows для компиляции кода? Если нет, есть ли способ достичь этого?Условно компиляция в C++ на основе окон версии

Я думаю, что это должно выглядеть примерно так:

void SomeClass::SomeFunction() 
{ 
    // Other code 

#ifdef WINXP 
    windowsXPCall(); 
#else 
    WindowsCall(); 
#endif 

    // Other code 
} 
+0

Я считаю, что системная библиотека: http://www.cplusplus.com/reference/cstdlib/system/ может использоваться для запуска исполняемых файлов. Используя это, вы можете запускать что-то вроде проверки версии Windows. Однако это произойдет только во время выполнения и, вероятно, не так полезно во время компиляции. Не уверен, что это решает вашу проблему, но удачи :) – Liang

+0

Обычно вы не создавали отдельное приложение для Windows XP, вы бы создали одно приложение, которое работает как для XP, так и для более поздних версий. Иногда это означает, что просто использовать WindowsXPCall, который в большинстве случаев будет доступен в более поздних версиях, а иногда это означает принятие решения о том, какой вызов выполнить во время выполнения. –

+0

Если вы действительно хотите создать отдельный исполняемый файл, вы можете обнаружить использование набора инструментов XP в соответствии с [этим вопросом] (http://stackoverflow.com/q/23279157/886887). –

ответ

2

Ответ зависит от компилятора и набора инструментов. Если вопрос о Visual C++, вы должны пометить его как таковой.

Для версии VC++ поддерживаемая минимальная версия ОС контролируется набором макросов, описанных в Using the Windows Headers.

В простейшем случае целевой XP вы должны добавить

#define _WIN32_WINNT 0x0501 

перед включением любой из заголовков окон, или добавить /D_WIN32_WINNT=0x0501 в командной строке компилятора.

Замените 0x0501 на 0x0502, если вам не нужна поддержка оригинальной версии XP (без каких-либо пакетов обновлений), за одно примечание в той же связанной статье.

Обратите внимание, что некоторые функции, представленные в последней версии Windows, могут быть добавлены в пакет обновления для предыдущей версии Windows. Поэтому, чтобы настроить таргетинг на пакет обновления, вам может потребоваться определить _WIN32_WINNT со значением для следующей крупной версии операционной системы. Например, функция GetDllDirectory была введена в Windows Server 2003 и условно определена, если _WIN32_WINNT равно 0x0502 или выше. Эта функция также была добавлена ​​в Windows XP с пакетом обновления 1 (SP1). Поэтому, если вы должны определить _WIN32_WINNT как 0x0501 для целевой Windows XP, вы пропустите функции, определенные в Windows XP с пакетом обновления 1 (SP1).

P.S. Это вы контролируете источники и флаговые компиляции своего собственного кода, поэтому я не уверен, как ответить на эту часть исходного вопроса.

Какие условные флаги компиляции можно проверить, чтобы определить, какие ОС Windows для компиляции кода?

0

С помощью одного исполняемого файла определение «какая версия, на которую вы нацелились» не имеет особого смысла; ваш исполняемый файл должен настроить таргетинг на каждую версию. #ifdef, как указано выше, не может решить вашу проблему, если вы не создаете несколько исполняемых файлов (или используйте вспомогательную dll, в которой вы создаете более одной версии).

Ваша проблема может быть решена путем «как ограничить API доступным для winXP». Ответ @ dxiv решает эту проблему.