[C/C++] Detectar versión de Windows

Iniciado por _TTFH_3500, 8 Abril 2016, 02:45 AM

0 Miembros y 1 Visitante están viendo este tema.

_TTFH_3500

Quería saber como hacer para detectar la versión de Windows en C, sin importar que ejecute el programa en modo de compatibilidad, de hecho me alcanza con encontrar el primer numero en la versión (en win xp y 2000 es el 5, en win 7, 8 y 8.1 es el 6, en win 10 el 10, etc.).

Se que hay otras menares de detectar la versión como si existe "Documents and Setting", si existe d3d12.exe, pero me gustaría algo mas general.

En Batch seria asi y siempre funciona ya que 'ver' es igual en modo compatibilidad.
Código (dos) [Seleccionar]
@Echo off
echo La version es: && ver
ver | find "5." > nul
If %ERRORLEVEL% == 0 (
  echo Windows 2000 o XP detectado
)


En Visual Basic Script seria:
Código (vb) [Seleccionar]
Set oWMI = GetObject("winmgmts:\\.\root\CIMV2")
Set cWin = oWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each OS In cWin
  message = MSGBOX(OS.Version, 16, "La version es:")
  If Split(OS.Version,".")(0) = 5 Then
    message = MSGBOX("Windows 2000 o XP detectado", 16, "Mensaje")
  End If
Next



Pero en C no me funciona, ademas de que GetVersion devuelve otro valor en win8.1 y win10.

#include <stdio.h>
#include <windows.h>
int main() {
  DWORD dwVersion = GetVersion();
  DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
  DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
  DWORD dwBuild = 0;
  if (dwVersion < 0x80000000)
    dwBuild = (DWORD)(HIWORD(dwVersion));
  printf("La version es: %d.%d.%d\n", dwMajorVersion, dwMinorVersion, dwBuild);
  if (dwMajorVersion == 5)
    printf("Windows 2000 o XP detectado");
}


Lo que busco es lo que en el ejemplo seria el valor de la variable dwMajorVersion

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


_TTFH_3500

Cita de: MCKSys Argentina en  8 Abril 2016, 03:04 AM
Revisaste esta info?

Saludos!

Si, las funciones IsWindows**OrGreater en versionhelpers.h se basan en que por ejemplo en winXP no puedo ejecutar en modo compatibilidad con Win7, entonces estaría usando WinXP o mayor, pero no funciona si es al revés porque si ejecuto en modo compatibilidad con X versión, tengo esa versión o mayor y no se exactamente cual.

Creo que podría solucionarlo con esto: https://msdn.microsoft.com/en-us/library/windows/desktop/ms725492%28v=vs.85%29.aspx, luego lo pruebo.

Usando VerifyVersionInfo y lpVersionInfo de windows.h