NOTE AJOUTÉE: VOIR LE MESSAGE #10 POUR LE CODE FINAL (revu et corrigé)

ASTUCE: Comment identifier avec certitude la version Windows.

Réponse: En examinant toutes les fonctions API exportées par kernel32.dll
Ces fonctions sont différentes pour chaque version:

Ainsi:

GetLocaleInfoEx
Vista, Server 2003, XP SP1, XP SP2, 2000, ME, NT4, 98, 95
GetLargePageMinimum Vista, Server
GetDLLDirectory Vista, Server 2003, XP, SP1
GetNativeSystemInfo Vista, Server 2003, XP SP1, XP
ReplaceFile Vista, Server 2003, XP SP1, XP, 2000
OpenThread Vista, Server 2003, XP SP1, XP, 2000, ME
GetThreadPriorityBoost Vista, Server 2003, XP SP1, XP, 2000, NT4
IsDebuggerPresent Vista, Server 2003, XP SP1, XP, 2000, ME, NT4, 98
GetDiskFreeSpaceEx Vista, Server 2003, XP SP1, XP, 2000, ME, NT4, 98, 95, 95R2
ConnectNamedPipe Vista, Server 2003, XP SP1, XP, 2000, NT3
Beep Vista, Server 2003, XP SP1, XP, 2000, ME, 98, NT3, 95

Cette fonction résume le tout:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  function GetTrueWindowsVersion: TWindowsVersion;
 
    function ExportsAPI(module: HMODULE; const apiName: string): boolean;
    begin
      Result := GetProcAddress(module, PChar(apiName)) <> nil;
    end; { ExportsAPI }
 
  var
    hKernel32: HMODULE;
 
  begin { GetTrueWindowsVersion }
    hKernel32 := GetModuleHandle('kernel32');
    Win32Check(hKernel32 <> 0);
    if ExportsAPI(hKernel32, 'GetLocaleInfoEx') then
      Result := wvWinVista
    else if ExportsAPI(hKernel32, 'GetLargePageMinimum') then
      Result := wvWinServer2003
    else if ExportsAPI(hKernel32, 'GetNativeSystemInfo') then
      Result := wvWinXP
    else if ExportsAPI(hKernel32, 'ReplaceFile') then
      Result := wvWin2000
    else if ExportsAPI(hKernel32, 'OpenThread') then
      Result := wvWinME
    else if ExportsAPI(hKernel32, 'GetThreadPriorityBoost') then
      Result := wvWinNT4
    else if ExportsAPI(hKernel32, 'IsDebuggerPresent') then  //aussi dans NT4
      Result := wvWin98
    else if ExportsAPI(hKernel32, 'GetDiskFreeSpaceEx') then  //aussi dans NT4
      Result := wvWin95OSR2
    else if ExportsAPI(hKernel32, 'ConnectNamedPipe') then
      Result := wvWinNT3
    else if ExportsAPI(hKernel32, 'Beep') then
      Result := wvWin95
    else // aucune idée de quoi il s'agit alors
      Result := GetWindowsVersion;
  end; { GetTrueWindowsVersion }