Chociaż Windows API ciągnie za sobą skutki kilkunastu lat wstecznej kompatybilności, nie znaczy to, że nie pojawiają się tam nowe możliwości. Ponieważ jednak wszystkie funkcje są importowane z DLL-i w sposób statyczny, nie jest możliwe, by każda nowsza była dostępna automatycznie. W przeciwnym wypadku program, który faktycznie działałby bez problemu np. na Windows 98 wymagałby w praktyce najnowszej wersji systemu – mimo tego, że nie korzysta z żadnej nowej funkcjonalności.
Niekiedy jednak nie chcemy ograniczać się do “wspólnego mianownika” wszystkich aktualnie obsługiwanych wersji Windows i chcemy użyć czegoś, co rzeczywiście jest dostępne począwszy od jakiejś nowszej edycji systemu. Co wtedy zrobić?
W dokumentacji (czyli MSDN) jest na szczęście dokładnie zaznaczone to, w której wersji Windows wprowadzoną daną funkcję czy strukturę. Ale żeby odpowiedni symbol został włączony do kompilacji i linkowania, należy jeszcze przed dołączeniem windowsowego nagłówka (zazwyczaj windows.h) zdefiniować odpowiednie makro.
A właściwie to nawet więcej niż jedno, jako że MSDN wspomina o czterech. Są to:
WINVER
i _WIN32_WINNT
, wskazujące na liczbową wersję systemu. Wartość 0x0502
oznacza na przykład wersję 5.1, czyli Windows XP z SP2._WIN32_IE
, mające zawierać docelową wymaganą wersję Internet ExploreraNTDDI_VERSION
, ustawialne na którąś z predefiniowanych stałych przypisanych każdej większej edycji Windows (np. NTDDI_WINXPSP1
lub NTDDI_WIN2K
)Pierwsze trzy są już uważane za przestarzałe i aktualnie używać należy NTDDI_VERSION
, które jest zresztą znacznie wygodniejsze. W praktyce dobrze jest jednak ustawiać wszystkie makra, zwłaszcza jeśli nasz kod może być potencjalnie kompilowany na wielu różnych wersjach Platform SDK. I tak na przykład jeśli chcemy wykorzystać pule wątków (thread pools) dostępne począwszy od Windows Vista, powinniśmy dodać taki oto kod:
Po wartości makr odpowiadające wszystkim edycjom Windows należy udać do MSDN, do sekcji:
Win32 and COM Development > Development Guides > Windows API > Using Windows Headers
Dodam tylko że VS Team Suite (nie wiem jak niższe) pozwala w Win32 project samodzielnie poprzestawiać te parametry. Dodatkowo kod #define NTDDI_VERSION NTDDI_VISTA jest automatycznie ustawiany w d3d10.h, więc jak ktoś pisze pod DX10, problemu nie ma.