CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - GetVersionEx i wersje Windowsów

GetVersionEx i wersje Windowsów

dział ogólny

GetVersionEx i wersje Windowsów

Nowy postprzez lukagrom » poniedziałek, 11 lutego 2019, 18:23

Googluje sobie i jakoś nie mogę odnaleźć sensownych wartości dla poniższej funkcji wywołującej
KOD cpp:     UKRYJ  
GetVersionEx()
właściwej wersji systemu. Znalazłem w starym podręczniku wartości dla rodziny 9x i NT. Dla nowszych od ME po dzisiejszą dziesiątkę, dla tego wywołania, jakoś nie udaje mi się uzyskać (są wywoływane przez inne funkcje w przykładach z googla jako
KOD cpp:     UKRYJ  
wProductType
, a nie jak u mnie
KOD cpp:     UKRYJ  
dwPlatformId
). Ktoś zna wartości - dwdwPlatformId dla współczesnych systemów?
KOD cpp:     UKRYJ  
OSVERSIONINFO o_Info;
 UnicodeString my_Os;
 o_Info.dwOSVersionInfoSize=sizeof(o_Info);
 GetVersionEx(&o_Info);
 switch(o_Info.dwPlatformId)
 {
         case VER_PLATFORM_WIN32s: my_Os="Windows32s";break;
         case VER_PLATFORM_WIN32_WINDOWS: my_Os="Windows 9x";break;
         case VER_PLATFORM_WIN32_NT: my_Os="Windows NT";break;


 default:
 my_Os="unknown";

 }
 
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 79
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: GetVersionEx i wersje Windowsów

Nowy postprzez polymorphism » wtorek, 12 lutego 2019, 11:49

Dla nowszych od ME po dzisiejszą dziesiątkę, dla tego wywołania, jakoś nie udaje mi się uzyskać.

Przecież ME to seria w95, a 2000, XP, Vista, 7, 8 i 10 to seria NT. Jak chcesz rozróżnić konkretne wersje systemu, użyj pól dwMajorVersion i dwMinorVersion. Szczegóły w opisie struktury OSVERSIONINFOEXA.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: GetVersionEx i wersje Windowsów

Nowy postprzez Cyfrowy Baron » środa, 13 lutego 2019, 09:58

Coś w tym stylu:

KOD cpp:     UKRYJ  
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef void (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
void __fastcall TForm1::GetMySystemInfo(void)
{
 OSVERSIONINFOEX info = {0};
 bool bOsVersionInfoEx;
 SYSTEM_INFO si;
 PGNSI pGNSI;
 PGPI pGPI;
 DWORD dwType;

 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&info);
 if(!bOsVersionInfoEx)
 {
  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  if(!GetVersionEx((OSVERSIONINFO *) &info)) return;
 }

 pGNSI = (PGNSI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
                                                      "GetNativeSystemInfo");
 if(NULL != pGNSI) pGNSI(&si);
 else GetSystemInfo(&si);

 String sysInfo = "";

 if(info.dwPlatformId == VER_PLATFORM_WIN32_NT) // wykrywanie systemu
 {
  switch(info.dwMajorVersion + info.dwMinorVersion)
  {
   case 10:
   {
        if(info.dwMajorVersion == 10 && info.dwMinorVersion == 0)  // WIN 10
        {
         sysInfo = "Microsoft Windows 10 32-bit ";
        // Button2->Enabled = false;  // <--
         if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
         {
          sysInfo = "Microsoft Windows 10 64-bit ";
        //  Button2->Enabled = true; // <--
          win10 = true;
          bit64 = true;
         // ActiveControl = Button2;
         }
        }
        break;
   }
   case 9:
   {
        if(info.dwMajorVersion == 6 && info.dwMinorVersion == 3) // WIN 8.1
        {
         sysInfo = "Microsoft Windows 8.1 32-bit ";
   //    Button2->Enabled = false; // <--
         if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
         {
          sysInfo = "Microsoft Windows 8.1 64-bit ";
          bit64 = true;
        //  Button2->Enabled = true; // <--
        //  ActiveControl = Button2;
         }
        }
        break;
   }
   case 8:
   {
        if(info.dwMajorVersion == 6 && info.dwMinorVersion == 2)  // WIN 8
        {
         sysInfo = "Microsoft Windows 8 32-bit ";
  //     Button2->Enabled = false;  // <--
         if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
         {
          sysInfo = "Microsoft Windows 8 64-bit ";
      bit64 = true;
        //  Button2->Enabled = true; // <--
         // ActiveControl = Button2;
         }
        }
        break;
   }
   case 7://if(info.dwMajorVersion == 6 && info.dwMinorVersion == 1)
   {
        if(info.dwMajorVersion == 6 && info.dwMinorVersion == 1)     // WIN 7
        {
         sysInfo = "Microsoft Windows 7 32-bit ";
        // Button2->Enabled = false; // <--
         if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
         {
          sysInfo = "Microsoft Windows 7 64-bit ";
          bit64 = true;
        //  Button2->Enabled = true; // <--
   //     ActiveControl = Button2;
         }
        }
    else
        {
          if(GetSystemMetrics(SM_SERVERR2))
          {
           sysInfo = "Microsoft Windows Server 2003 \"R2\" ";
           oldWin = true;
          }
      else
      {
       if(info.wProductType == VER_NT_WORKSTATION &&
           si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
           {
                        sysInfo = "Microsoft Windows XP Professional x64 Edition ";
                        oldWin = true;
                        winXP = true;
           }
                   else
                   {
                        sysInfo = "Microsoft Windows Server 2003 ";
                        oldWin = true;
                   }
      }
    }
    break;
   }
  case 6://if(info.dwMajorVersion == 5 && info.dwMinorVersion == 1)
  {
   if(info.dwMajorVersion == 5)  // WIN XP
   {
        sysInfo = "Microsoft Windows XP 32-bit ";
        oldWin = true;
        winXP = true;
   }
   else
   {
        if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
        {
         sysInfo = "Microsoft Windows Vista 64-bit ";
         bit64 = true;
         oldWin = false;
        }
   }

        break;
  }
  case 5://if(infodwMajorVersion == 5 && infodwMinorVersion == 0 )
  {
        sysInfo = "Microsoft Windows 2000 ";
        oldWin = true;
  }
        break;
  default://if(infodwMajorVersion <= 4 )
  {
   sysInfo = "Microsoft Windows NT ";
   oldWin = true;
  }
   break;
  }
  if( bOsVersionInfoEx)
  {
   if(info.wProductType == VER_NT_WORKSTATION)
   {
    if(info.dwMajorVersion == 4) sysInfo += "Workstation 4.0 ";
    else
    {
     if(info.wSuiteMask & VER_SUITE_PERSONAL) sysInfo += "Home Edition ";
     else
     {
      if(info.wSuiteMask & VER_SUITE_ENTERPRISE) sysInfo += "Enterprise ";
      else
      {
       if(info.dwMajorVersion == 5 && info.dwMinorVersion == 1)
        sysInfo += "Professional ";
      }
     }
    }

   }
   else
    if(info.wProductType == VER_NT_SERVER)
    {
     if(info.dwMajorVersion == 5 && info.dwMinorVersion == 2)
     {
      if(info.wSuiteMask & VER_SUITE_DATACENTER) sysInfo += "Datacenter Edition " ;
      else if(info.wSuiteMask & VER_SUITE_ENTERPRISE) sysInfo += "Enterprise Edition " ;
           else if(info.wSuiteMask == VER_SUITE_BLADE ) sysInfo += "Web Edition ";
                else sysInfo += "Standard Edition ";
     }
     else
      if(info.dwMajorVersion == 5 && info.dwMinorVersion == 0)
      {
       if(info.wSuiteMask & VER_SUITE_DATACENTER) sysInfo += "Datacenter Server ";
       else if(info.wSuiteMask & VER_SUITE_ENTERPRISE) sysInfo += "Advanced Server ";
            else sysInfo += "Server ";
      }
      else  // Windows NT 4.0
      {
       if(info.wSuiteMask & VER_SUITE_ENTERPRISE)
         sysInfo += "Server 4.0, Enterprise Edition ";
       else sysInfo += "Server 4.0 ";
      }
    }
   }
  } // koniec wyjrywania systemu

 if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) // sprawdzanie Win no NT
 {

  switch(info.dwMajorVersion + info.dwMinorVersion)
  {
   case 4://if(info.dwMajorVersion == 4 && info.dwMinorVersion == 0)
        sysInfo = "Microsoft Windows 95 ";
        oldWin = true;
        if(info.szCSDVersion[1] == 'C' || info.szCSDVersion[1] == 'B')
       sysInfo += "OSR2 ";
    break;

   case 14://if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
   {
        sysInfo = "Microsoft Windows 98 ";
        oldWin = true;
        if(info.szCSDVersion[1]== 'A' || info.szCSDVersion[1] == 'B')
           sysInfo += "SE ";
   }
    break;
   case 94://(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
   {
         sysInfo = "Microsoft Windows Millennium Edition ";
         oldWin = true;
   }
    break;
  }
 } // koniec sprawdzania Win no NT

 if(info.dwPlatformId == VER_PLATFORM_WIN32_NT && info.dwMajorVersion > 4)
 {
  pGPI = (PGPI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
                                                    "GetProductInfo");

  if(pGPI != NULL) pGPI(info.dwMajorVersion, info.dwMinorVersion, 0, 0, &dwType);

  switch( dwType )
  {
   case PRODUCT_ULTIMATE:
               sysInfo += "Ultimate ";
               break;
   case PRODUCT_PROFESSIONAL:
               sysInfo += "Professional ";
               break;
   case PRODUCT_HOME_PREMIUM:
               sysInfo += "Home Premium Edition ";
               break;
   case PRODUCT_HOME_BASIC:
               sysInfo += "Home Basic Edition ";
               break;
   case PRODUCT_BUSINESS:
               sysInfo += "Business Edition ";
               break;
   case PRODUCT_STARTER:
               sysInfo += "Starter Edition ";
               break;
  }
 }

 sysInfo += "(Build " + (String)info.dwBuildNumber + ") ";

 switch(info.wServicePackMajor)
 {
   case 1: sysInfo += "Dodatek Service Pack 1"; break;
   case 2: sysInfo += "Dodatek Service Pack 2"; break;
   case 3: sysInfo += "Dodatek Service Pack 3"; break;
 }

 StatusBar1->Panels->Items[0]->Text = sysInfo; // <-- tutaj pojawia się informacja o systemie
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: GetVersionEx i wersje Windowsów

Nowy postprzez lukagrom » środa, 13 lutego 2019, 16:06

Danke, zrozumiałem. W tej funkcji GetVersionEx, zabrakła klilka deklaracji zmiennych wykorzystywanych pózniej, ale wnoszę naturalnie, że chodziło o typ -
KOD cpp:     UKRYJ  
bool
.
Z ciekawostek dla Linuksów to raptem dwulinijkowe wywołanie:
KOD cpp:     UKRYJ  
struct utsname info;
uname (&info);
printf("%s wydanie %s (wersja) %s) na %s\n",inofo.sysname,info.release,info.version,info.machine);
 
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 79
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: GetVersionEx i wersje Windowsów

Nowy postprzez polymorphism » środa, 13 lutego 2019, 16:28

A dla Windowsa to niby ile jest linii?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: GetVersionEx i wersje Windowsów

Nowy postprzez Cyfrowy Baron » piątek, 15 lutego 2019, 11:51

lukagrom napisał(a):Danke, zrozumiałem. W tej funkcji GetVersionEx, zabrakła klilka deklaracji zmiennych wykorzystywanych pózniej, ale wnoszę naturalnie, że chodziło o typ -
KOD cpp:     UKRYJ  
bool


Za cholerę nie rozumiem, co chciałeś przez to powiedzieć.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: GetVersionEx i wersje Windowsów

Nowy postprzez lukagrom » sobota, 16 lutego 2019, 18:10

Już wyjaśniam (chyba) (bo pewnie znowu się mylę).
Zmienne -
KOD cpp:     UKRYJ  
 win10, bit64,oldWin,winXP
, nie były nigdzie deklarowane, przynajmniej w obrębie funkcji (takich deklaracji nie ma), a że przyjmują wartość
KOD cpp:     UKRYJ  
true
, to zakładam, że są typu -
KOD cpp:     UKRYJ  
bool
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 79
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: GetVersionEx i wersje Windowsów

Nowy postprzez polymorphism » sobota, 16 lutego 2019, 20:41

Ten kod, jak rozumiem, jest skądś wyciągnięty i miał Ci tylko pokazać, jak określić konkretną wersję systemu. Te zmienne, o których piszesz, nie mają jakiegoś większego znaczenia. Przeanalizuj kod, zrozum i napisz po swojemu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości

cron