본문 바로가기

프로그래밍/MFC

윈도우(OS) 버전 읽어오기





void GetOSVersion (LPSTR lpstInfo, LPSTR lpstBuildNumber, LPSTR lpstServicePack)
{
    int stat = 0;
    TCHAR data [64];
    DWORD dataSize;
    DWORD win95Info;
    OSVERSIONINFO versionInfo;
    HKEY hKey;
    LONG result;

    lpstServicePack[0] = 0;
    versionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);

    // 버전 정보를 얻어낸다.
    if (!::GetVersionEx (&versionInfo))
    {
        strcpy(lpstInfo, "운영체제 정보를 얻을 수 없습니다.");
        return;
    }

    // NT이면 서버인지 웍스테이션인지 검사한다. 이는 레지스트리를 보고 검사한다.
    if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        strcpy(lpstInfo, "Windows NT");
        dataSize = sizeof (data); 
        result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
        "System\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey);

        if (result != ERROR_SUCCESS)
            return;

        result = ::RegQueryValueEx (hKey, "ProductType", NULL, NULL, (LPBYTE) data, &dataSize);
        RegCloseKey (hKey);

        if (result != ERROR_SUCCESS)
            return;

        if (lstrcmpi (data, "WinNT") == 0)
            strcpy(lpstInfo, "Windows NT Workstation");
        else if (lstrcmpi (data, "ServerNT") == 0)
            strcpy(lpstInfo, "Windows NT Server");
        else
            strcpy(lpstInfo, "Windows NT Server - Domain Controller");

        // NT 버전을 알아낸다.
        if (versionInfo.dwMajorVersion == 3 || versionInfo.dwMinorVersion == 51)
            strcat(lpstInfo, " 3.51");
        else if (versionInfo.dwMajorVersion == 5) // 윈도우 2000의 경우
            strcat(lpstInfo, " 5.0");
        else
            strcat(lpstInfo, " 4.0");

        // Build 번호를 알아낸다.
        wsprintf(lpstBuildNumber, "%d", versionInfo.dwBuildNumber);
    }
    else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    {
        strcpy(lpstInfo, "Windows 95");
        if ((versionInfo.dwMajorVersion > 4) || ((versionInfo.dwMajorVersion == 4)
        && (versionInfo.dwMinorVersion > 0)))
        {
            strcpy(lpstInfo, "Windows 98");
        }
        // 윈도우 95는 Build 번호가 하위 워드에 들어간다.
        win95Info = (DWORD)(LOBYTE(LOWORD(versionInfo.dwBuildNumber)));
        wsprintf(lpstBuildNumber, "%d", win95Info);
    }
    else
    wsprintf(lpstInfo, "Windows 3.1");

    // 서비스 팩 정보를 얻어낸다.
    strcpy(lpstServicePack, versionInfo.szCSDVersion);
}