Rozpoznawanie systemu

dział ogólny

Rozpoznawanie systemu

Nowy postprzez Pitek » czwartek, 16 grudnia 2010, 00:14

Witam jak rozpoznać na jakim systemie została uruchomiona dana aplikacja z poziomu tej aplikacji?
Chodziło by mi o coś takiego że gdy program wykryje że jest uruchomiony na Win7 to robi coś innego a na XP też coś innego.
Czyli rozpoznanie i według tego warunek.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Rozpoznawanie systemu

Nowy postprzez Corvis » czwartek, 16 grudnia 2010, 10:35

"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Rozpoznawanie systemu

Nowy postprzez Cyfrowy Baron » czwartek, 16 grudnia 2010, 12:13

KOD cpp:     UKRYJ  
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef void (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
String SystemInfo(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 "Nieznany system";
 }

 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 7://if(info.dwMajorVersion == 5 && info.dwMinorVersion == 2)
   {
    if(info.dwMajorVersion == 6 && info.dwMinorVersion == 1)
    {
     sysInfo = "Microsoft Windows 7 ";
    }
    else
    {
      if(GetSystemMetrics(SM_SERVERR2))
       sysInfo = "Microsoft Windows Server 2003 \"R2\" ";
      else
      {
       if(info.wProductType == VER_NT_WORKSTATION &&
           si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
           {
            sysInfo = "Microsoft Windows XP Professional x64 Edition ";
           }
           else sysInfo = "Microsoft Windows Server 2003 ";
      }
    }
    break;
   }
  case 6://if(info.dwMajorVersion == 5 && info.dwMinorVersion == 1)
  {
   if(info.dwMajorVersion == 5)
   {
    sysInfo = "Microsoft Windows XP ";
   }
   else sysInfo = "Microsoft Windows Vista ";

    break;
  }
  case 5://if(infodwMajorVersion == 5 && infodwMinorVersion == 0 )
    sysInfo = "Microsoft Windows 2000 ";
    break;
  default://if(infodwMajorVersion <= 4 )
   sysInfo = "Microsoft Windows NT ";
   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 == 4 && info.dwMinorVersion)
  {
   case 4://if(info.dwMajorVersion == 4 && info.dwMinorVersion == 0)
    sysInfo = "Microsoft Windows 95 ";
    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 ";
    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 ";
    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;
 }

 return sysInfo;
}
//------------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
 Label1->Caption = SystemInfo();
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozpoznawanie systemu

Nowy postprzez Darek_C++ » czwartek, 16 grudnia 2010, 17:16

w Turbo C++ Explorer wywaliło takie błędy przy kompilacji:

Build
[C++ Error] Unit1.cpp(64): E2451 Undefined symbol 'SM_SERVERR2'
[C++ Error] Unit1.cpp(172): E2451 Undefined symbol 'PRODUCT_ULTIMATE'
[C++ Error] Unit1.cpp(175): E2451 Undefined symbol 'PRODUCT_PROFESSIONAL'
[C++ Error] Unit1.cpp(175): E2172 Duplicate case
[C++ Error] Unit1.cpp(176): E2188 Expression syntax
[C++ Error] Unit1.cpp(178): E2451 Undefined symbol 'PRODUCT_HOME_PREMIUM'
[C++ Error] Unit1.cpp(178): E2172 Duplicate case
[C++ Error] Unit1.cpp(179): E2188 Expression syntax
[C++ Error] Unit1.cpp(181): E2451 Undefined symbol 'PRODUCT_HOME_BASIC'
[C++ Error] Unit1.cpp(181): E2172 Duplicate case
[C++ Error] Unit1.cpp(182): E2188 Expression syntax
[C++ Error] Unit1.cpp(184): E2451 Undefined symbol 'PRODUCT_BUSINESS'
[C++ Error] Unit1.cpp(184): E2172 Duplicate case
[C++ Error] Unit1.cpp(185): E2188 Expression syntax
[C++ Error] Unit1.cpp(187): E2451 Undefined symbol 'PRODUCT_STARTER'
[C++ Error] Unit1.cpp(187): E2172 Duplicate case
[C++ Error] Unit1.cpp(188): E2188 Expression syntax

Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozpoznawanie systemu

Nowy postprzez Cyfrowy Baron » czwartek, 16 grudnia 2010, 17:59

Brak odpowiednich bibliotek. Turbo C++ powstał na długo przed systemem Vista. Pozostaje Tobie tylko pobierać nazwę z rejestru, z klucza: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion wartość binarna ProductName zawiera nazwę systemu, a wartość CSDVersion informacje o service packach. Zadziała to tylko w systemach opartych na jądrze NT. W Windows 95 i 98 te informacje są pewnie w innym kluczu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • 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 3 gości