Исправлено форматирование текста.
Здравствуйте, 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);