requisitos - Cómo determinar la versión de Windows en una forma a prueba de futuro
windows 10 requisitos recomendados (1)
MSDN tiene msdn.microsoft.com/en-us/library/windows/desktop/… muestra cómo usar las funciones de ayuda de la versión (inútil para su escenario), pero en la introducción se encuentra lo siguiente:
Para obtener el número de versión completo del sistema operativo, llame a la función GetFileVersionInfo en una de las DLL del sistema, como Kernel32.dll, luego llame a VerQueryValue para obtener el subbloque / StringFileInfo // ProductVersion de la información de la versión del archivo.
A partir de ahora, ni la función GetFileVersionInfo
ni la función VerQueryValue
están en desuso.
Ejemplo
Esto extraerá la versión del producto de kernel32.dll
y la imprimirá en la consola:
#pragma comment(lib, "version.lib")
static const wchar_t kernel32[] = L"//kernel32.dll";
wchar_t *path = NULL;
void *ver = NULL, *block;
UINT n;
BOOL r;
DWORD versz, blocksz;
VS_FIXEDFILEINFO *vinfo;
path = malloc(sizeof(*path) * MAX_PATH);
if (!path)
abort();
n = GetSystemDirectory(path, MAX_PATH);
if (n >= MAX_PATH || n == 0 ||
n > MAX_PATH - sizeof(kernel32) / sizeof(*kernel32))
abort();
memcpy(path + n, kernel32, sizeof(kernel32));
versz = GetFileVersionInfoSize(path, NULL);
if (versz == 0)
abort();
ver = malloc(versz);
if (!ver)
abort();
r = GetFileVersionInfo(path, 0, versz, ver);
if (!r)
abort();
r = VerQueryValue(ver, L"//", &block, &blocksz);
if (!r || blocksz < sizeof(VS_FIXEDFILEINFO))
abort();
vinfo = (VS_FIXEDFILEINFO *) block;
printf(
"Windows version: %d.%d.%d",
(int) HIWORD(vinfo->dwProductVersionMS),
(int) LOWORD(vinfo->dwProductVersionMS),
(int) HIWORD(vinfo->dwProductVersionLS));
free(path);
free(ver);
Noté que GetVersionEx()
está declarado en desuso. Peor aún, para Windows 8.1 (y, presumiblemente, futuras versiones), el número de versión está limitado por el manifiesto de la aplicación.
Mi objetivo es recopilar información analítica sobre los sistemas operativos que los usuarios están ejecutando, para poder orientar adecuadamente el soporte. Me gustaría una solución a prueba de futuro para recopilar estos datos. La actualización del manifiesto no funcionará porque solo puedo actualizar el manifiesto para las versiones de Windows que ya se han publicado, no para las versiones futuras. La API de reemplazo sugerida, las funciones de ayuda de la versión , es inútil.
¿Cómo puedo recopilar el número de versión real de Windows?
Para aclarar: con "pruebas futuras", solo quiero decir que quiero algo que tenga una probabilidad razonablemente buena de trabajar en la próxima versión de Windows. Nada es seguro, pero los documentos dicen que GetVersionEx()
no funcionará.