1 //获取系统版本
  2 BOOL GetOSName( CString& csOsName )
  3 {
  4  OSVERSIONINFOEX osvi;
  5  SYSTEM_INFO si;
  6  BOOL bOsVersionInfoEx;
  7  ZeroMemory(&si, sizeof(SYSTEM_INFO));
  8  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  9 
 10  // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
 11  // If that fails, try using the OSVERSIONINFO structure.
 12 
 13  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 14 
 15  bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi);
 16  if( !bOsVersionInfoEx )
 17  {
 18   osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
 19   if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
 20    return FALSE;
 21  }
 22 
 23  // Call GetNativeSystemInfo if supported
 24  // or GetSystemInfo otherwise.
 25  else GetSystemInfo(&si);
 26 
 27  switch (osvi.dwPlatformId)
 28  {
 29   // Test for the Windows NT product family.
 30 
 31  case VER_PLATFORM_WIN32_NT:
 32 
 33   // Test for the specific product.
 34 
 35   if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
 36   {
 37    if( osvi.wProductType == VER_NT_WORKSTATION )
 38    {
 39     csOsName += _T( "Windows Vista " );
 40    }
 41    else 
 42    {
 43     csOsName += _T( "Windows Server \"Longhorn\" " );
 44    }
 45   }
 46 
 47   if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
 48   {
 49    if( osvi.wProductType == VER_NT_WORKSTATION &&
 50     si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
 51    {
 52     csOsName += _T( "Microsoft Windows XP Professional x64 Edition " );
 53    }
 54    else 
 55    {
 56     csOsName += _T( "Microsoft Windows Server 2003, " );
 57    }
 58   }
 59 
 60   if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
 61   {
 62    csOsName += _T( "Microsoft Windows XP " );
 63   }
 64 
 65   if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
 66   {
 67    csOsName += _T( "Microsoft Windows 2000 " );
 68   }
 69 
 70   if ( osvi.dwMajorVersion <= 4 )
 71   {
 72    csOsName += _T( "Microsoft Windows NT " );
 73   }
 74 
 75   // Test for specific product on Windows NT 4.0 SP6 and later.
 76   if( bOsVersionInfoEx )
 77   {
 78    // Test for the workstation type.
 79    if ( osvi.wProductType == VER_NT_WORKSTATION &&
 80     si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
 81    {
 82     if( osvi.dwMajorVersion == 4 )
 83     {
 84      csOsName += _T( "Workstation 4.0 " );
 85     }
 86     else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
 87     {
 88      csOsName += _T( "Home Edition " );
 89     }
 90     else 
 91     {
 92      csOsName += _T( "Professional " );
 93     }
 94    }
 95 
 96    // Test for the server type.
 97    else if ( osvi.wProductType == VER_NT_SERVER || 
 98     osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
 99    {
100     if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
101     {
102      if ( si.wProcessorArchitecture ==
103       PROCESSOR_ARCHITECTURE_IA64 )
104      {
105       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
106       {
107        csOsName += _T("Datacenter Edition for Itanium-based Systems");
108       }
109       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
110       {
111        csOsName += _T("Enterprise Edition for Itanium-based Systems");
112       }
113      }
114 
115      else if ( si.wProcessorArchitecture ==
116       PROCESSOR_ARCHITECTURE_AMD64 )
117      {
118       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
119       {
120        csOsName += _T( "Datacenter x64 Edition " );
121       }
122       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
123       {
124 
125       }
126       else 
127       {
128        csOsName += _T( "Standard x64 Edition " );
129       }
130      }
131      else
132      {
133       if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
134       {
135        csOsName += _T( "Datacenter Edition " );
136       }
137       else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
138       {
139        csOsName += _T( "Enterprise Edition " );
140       }
141       else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
142       {
143        csOsName += _T( "Web Edition " );
144       }
145       else 
146       {
147        csOsName += _T( "Standard Edition " );
148       }
149      }
150     }
151     else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
152     {
153      if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
154      {
155       csOsName += _T( "Datacenter Server " );
156      }
157      else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
158      {
159       csOsName += _T( "Advanced Server " );
160      }
161      else 
162      {
163       csOsName += _T( "Server " );
164      }
165     }
166     else  // Windows NT 4.0 
167     {
168      if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
169      {
170       csOsName += _T( "Server 4.0, Enterprise Edition " );
171      }
172      else 
173      {
174       csOsName += _T( "Server 4.0 " );
175      }
176     }
177    }
178   }
179   // Test for specific product on Windows NT 4.0 SP5 and earlier
180   else  
181   {
182    HKEY hKey;
183    TCHAR szProductType[256];
184    DWORD dwBufLen=256*sizeof(TCHAR);
185    LONG lRet;
186 
187    lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
188     _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 
189     0, KEY_QUERY_VALUE, &hKey );
190    if( lRet != ERROR_SUCCESS )
191     return FALSE;
192 
193    lRet = RegQueryValueEx( hKey, TEXT("ProductType"),
194     NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
195    RegCloseKey( hKey );
196 
197    if( (lRet != ERROR_SUCCESS) ||
198     (dwBufLen > 256*sizeof(TCHAR)) )
199     return FALSE;
200 
201    if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )
202    {
203     csOsName += _T( "Workstation " );
204    }
205    if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )
206    {
207     csOsName += _T( "Server " );
208    }
209    if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )
210    {
211     csOsName += _T( "Advanced Server " );
212    }
213    CString cstmp;
214    cstmp.Format( _T( "%d.%d " ), osvi.dwMajorVersion, osvi.dwMinorVersion );
215    csOsName += cstmp;
216   }
217 
218   // Display service pack (if any) and build number.
219 
220   if( osvi.dwMajorVersion == 4 && 
221    lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )
222   { 
223    HKEY hKey;
224    LONG lRet;
225 
226    // Test for SP6 versus SP6a.
227    lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
228     _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 
229     0, KEY_QUERY_VALUE, &hKey );
230    if( lRet == ERROR_SUCCESS )
231    {
232     CString cstmp;
233     cstmp.Format( _T( "Service Pack 6a (Build %d)" ), osvi.dwBuildNumber & 0xFFFF );
234     csOsName += cstmp;
235    }        
236    else // Windows NT 4.0 prior to SP6a
237    {
238     CString cstmp;
239     cstmp.Format( _T( "%s (Build %d)" ), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF );
240     csOsName += cstmp;
241    }
242    RegCloseKey( hKey );
243   }
244   else // not Windows NT 4.0 
245   {
246    CString cstmp;
247    cstmp.Format( _T( "%s (Build %d)" ), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF );
248    csOsName += cstmp;
249   }
250 
251   break;
252 
253   // Test for the Windows Me/98/95.
254  case VER_PLATFORM_WIN32_WINDOWS:
255 
256   if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
257   {
258    csOsName += _T( "Microsoft Windows 95 " );
259    if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
260    {
261     csOsName += _T( "OSR2 " );
262    }
263   } 
264 
265   if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
266   {
267    csOsName += _T("Microsoft Windows 98 ");
268    if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
269    {
270     csOsName += _T("SE " );
271    }
272   } 
273 
274   if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
275   {
276    csOsName += _T("Microsoft Windows Millennium Edition");
277   } 
278   break;
279 
280  case VER_PLATFORM_WIN32s:
281 
282   csOsName += _T("Microsoft Win32s\n");
283   break;
284  }
285  return TRUE; 
286 }