Re: Унификация получения списка процессов под WinNT и Win9x
От: DiMidRoLL Россия www.hackcoding.h11.ru
Дата: 04.07.04 11:30
Оценка:
Исправлено форматирование текста.

Здравствуйте, KoMikadze, Вы писали:

KM>Народ, проблема в следующем! Пишу прогу на VC++ 6.0 (MFC). В NT для получеия списка процессов используется psapi.dll, а в Win9x — ToolHelp. На этапе старта она определяет WinNT или Win9x и должна использовать тот или иной механизм для получения списка процессов. На практике получается, что прога даёт сбой при старте, пытаясь проверить функции ToolHelp в NT и PSAPI в 9x из соответствующих заголовочных файлов и, естественно, не находя их. Как обойти это?



Чтобы узнать какая ось у тебя на компе попробуй следующий код (правда большой, но определяет прямо до Build'a):

   char Buffer[1024];
   memset(Buffer,0,sizeof(Buffer));
   char *p=Buffer;

////////// Узнать ось

   OSVERSIONINFOEX osvi;
   BOOL bOsVersionInfoEx;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
   
   if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi)))
   {  
      osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   }

   switch (osvi.dwPlatformId)
   {
         case VER_PLATFORM_WIN32_NT: /////////// Проверяем семейство Windows NT
        
             if (osvi.dwMajorVersion <= 4)
                strcat(p,"Microsoft Windows NT  ");
             if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
                strcat(p,"Microsoft Windows 2000  ");
         
             if (bOsVersionInfoEx)  // Используем информацию из GetVersionEx.
             { 
                if(osvi.wProductType == VER_NT_WORKSTATION)
                {
                    if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
                        strcat(p,"Microsoft Windows XP  ");
                    if(osvi.wSuiteMask & VER_SUITE_PERSONAL)
                        strcat(p,"Home Edition  ");
                    else
                        strcat(p,"Professional  ");
                }
                else
                {
                    if ( osvi.wProductType == VER_NT_SERVER )
                    {
                        if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
                        strcat(p,"Microsoft Windows .NET  ");
                        if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
                        strcat(p,"DataCenter Server  ");
                    }
                    else 
                    {
                        if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
                        {
                             if( osvi.dwMajorVersion == 4 )
                                strcat(p,"Advanced Server  ");
                             else
                                strcat(p,"Enterprise Server  ");
                        }
                        else
                        {
                             if(osvi.wSuiteMask == VER_SUITE_BLADE)
                                strcat(p,"Web Server  ");
                             else
                                strcat(p,"Server  ");
                        }
                    }
                }

             }
             else 
             {
                HKEY hKey;
                char szProductType[80];
                DWORD dwBufLen=80;
                LONG lRet;
                lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                                     "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
                                      0, KEY_QUERY_VALUE,&hKey);
                lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL,(LPBYTE) szProductType, &dwBufLen);
                RegCloseKey(hKey);
                if(lstrcmpi("WINNT", szProductType) == 0 )
                strcat(p,"Professional  ");
                if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
                strcat(p,"Server  ");
                if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
                strcat(p,"Advanced Server  ");
             }

             // Отображаем версию, service pack (если есть), и номер билда.
             if (osvi.dwMajorVersion <= 4)
             {
                strcat(p,"version "); 
                strcat(p,ltoa(osvi.dwMajorVersion,Hour,10));
                strcat(p,"."); 
                strcat(p,ltoa(osvi.dwMinorVersion,Hour,10));
                strcat(p," "); 
                strcat(p,osvi.szCSDVersion);
                strcat(p," Build ");
                strcat(p,ltoa(osvi.dwBuildNumber & 0xFFFF,Hour,10));
             }
             else
             { 
                strcat(p,osvi.szCSDVersion);
                strcat(p," Build ");
                strcat(p,ltoa(osvi.dwBuildNumber & 0xFFFF,Hour,10));
             }
         break;
         
         case VER_PLATFORM_WIN32_WINDOWS: ////// Проверяем семейство Windows 95
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
         {
             strcat(p,"Microsoft Windows 95  ");
             if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B')
             strcat(p,"OSR2");
         } 
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
         {
            strcat(p,"Microsoft Windows 98 ");
            if (osvi.szCSDVersion[1] == 'A')
            strcat(p,"SE");
         } 
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
         {
            strcat(p,"Microsoft Windows Millennium Edition");
         } 
         break;

   }

MessageBox(p);
Hello World!;
31 error(s) , 17 warning(s)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.